Passed
Pull Request — master (#23)
by
unknown
03:45
created

AkismetTest::testSpamDetectionForm()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 35
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

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