Completed
Pull Request — master (#23)
by
unknown
01:57
created

AkismetTest::testSaveSpam()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 42
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 30
c 1
b 0
f 1
nc 1
nop 0
dl 0
loc 42
rs 8.8571
1
<?php
2
3
namespace SilverStripe\Akismet\Tests;
4
5
use SilverStripe\Akismet\AkismetSpamProtector;
6
use SilverStripe\Akismet\Config\AkismetConfig;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\Core\Config\Config;
9
use SilverStripe\Akismet\Service\AkismetService;
10
use SilverStripe\SiteConfig\SiteConfig;
11
use SilverStripe\ORM\DB;
12
use SilverStripe\Dev\FunctionalTest;
13
14
class AkismetTest extends FunctionalTest
15
{
16
    protected static $extra_dataobjects = [AkismetTestSubmission::class];
17
18
    protected $usesDatabase = true;
19
20
    protected static $required_extensions = [
21
        SiteConfig::class => [
22
            AkismetConfig::class,
23
        ],
24
    ];
25
26
    protected static $extra_controllers = [
27
        AkismetTestController::class,
28
    ];
29
30
    protected function setUp()
31
    {
32
        parent::setUp();
33
        Injector::inst()->unregisterObjects(AkismetService::class);
34
35
        // Mock service
36
        Config::modify()->set(Injector::class, AkismetService::class, AkismetTestService::class);
37
        Config::modify()->set(AkismetSpamProtector::class, 'api_key', 'dummykey');
38
        AkismetSpamProtector::set_api_key(null);
39
40
        // Reset options to reasonable default
41
        Config::modify()->remove(AkismetSpamProtector::class, 'save_spam');
42
        Config::modify()->remove(AkismetSpamProtector::class, 'require_confirmation');
43
        Config::modify()->remove(AkismetSpamProtector::class, 'bypass_members');
44
        Config::modify()->set(AkismetSpamProtector::class, 'bypass_permission', 'ADMIN');
45
    }
46
47
    public function testSpamDetectionForm()
48
    {
49
        
50
        // Test "nice" setting
51
        $result = $this->post('AkismetTestController/Form', array(
52
            'Name' => 'person',
53
            'Email' => '[email protected]',
54
            'Content' => 'what a nice comment',
55
            'action_doSubmit' => 'Submit',
56
        ));
57
58
        $this->assertContains('Thanks for your submission, person', $result->getBody());
59
        $saved = AkismetTestSubmission::get()->last();
60
        $this->assertNotEmpty($saved);
61
        $this->assertEquals('person', $saved->Name);
62
        $this->assertEquals('[email protected]', $saved->Email);
63
        $this->assertEquals('what a nice comment', $saved->Content);
64
        $this->assertEquals(false, (bool)$saved->IsSpam);
65
        $saved->delete();
66
67
        // Test failed setting
68
        $result = $this->post('AkismetTestController/Form', array(
69
            'Name' => 'spam',
70
            'Email' => '[email protected]',
71
            'Content' => 'spam',
72
            'action_doSubmit' => 'Submit',
73
        ));
74
75
        $errorMessage = _t(
76
            'SilverStripe\\Akismet\\AkismetField.SPAM',
77
            "Your submission has been rejected because it was treated as spam."
78
        );
79
        $this->assertContains($errorMessage, $result->getBody());
80
        $saved = AkismetTestSubmission::get()->last();
81
        $this->assertEmpty($saved);
82
    }
83
84
    public function testSaveSpam()
85
    {
86
        Config::modify()->set(AkismetSpamProtector::class, 'save_spam', true);
87
88
        // Test "nice" setting
89
        $result = $this->post('AkismetTestController/Form', array(
90
            'Name' => 'person',
91
            'Email' => '[email protected]',
92
            'Content' => 'what a nice comment',
93
            'action_doSubmit' => 'Submit',
94
        ));
95
96
        $this->assertContains('Thanks for your submission, person', $result->getBody());
97
        $saved = AkismetTestSubmission::get()->last();
98
        $this->assertNotEmpty($saved);
99
        $this->assertEquals('person', $saved->Name);
100
        $this->assertEquals('[email protected]', $saved->Email);
101
        $this->assertEquals('what a nice comment', $saved->Content);
102
        $this->assertEquals(false, (bool)$saved->IsSpam);
103
        $saved->delete();
104
105
        $this->markTestIncomplete('@todo fix form validation message in AkismetField');
106
107
        // Test failed setting
108
        $result = $this->post('AkismetTestController/Form', array(
109
            'Name' => 'spam',
110
            'Email' => '[email protected]',
111
            'Content' => 'spam',
112
            'action_doSubmit' => 'Submit',
113
        ));
114
115
        $errorMessage = _t(
116
            'SilverStripe\\Akismet\\AkismetField.SPAM',
117
            "Your submission has been rejected because it was treated as spam."
118
        );
119
        $this->assertContains($errorMessage, $result->getBody());
120
        $saved = AkismetTestSubmission::get()->last();
121
        $this->assertNotEmpty($saved);
122
        $this->assertEquals('spam', $saved->Name);
123
        $this->assertEquals('[email protected]', $saved->Email);
124
        $this->assertEquals('spam', $saved->Content);
125
        $this->assertEquals(true, (bool)$saved->IsSpam);
126
    }
127
128
    /**
129
     * Test that the request processor can safely activate when able (and only then)
130
     */
131
    public function testProcessor()
132
    {
133
        $siteconfig = SiteConfig::current_site_config();
134
        $siteconfig->write();
135
136
        // Test assignment via request filter
137
        $processor = new AkismetTestTestMiddleware();
138
        $this->assertTrue($processor->publicIsDBReady());
139
140
        // Remove AkismetKey field
141
        DB::query('ALTER TABLE "SiteConfig" DROP COLUMN "AkismetKey"');
142
        $this->assertFalse($processor->publicIsDBReady());
143
    }
144
}
145