AkismetTest::testSaveSpam()   A
last analyzed

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 9.44
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
use SilverStripe\ORM\Connect\DatabaseException;
14
use SilverStripe\ORM\DataObject;
15
16
class AkismetTest extends FunctionalTest
17
{
18
    protected static $extra_dataobjects = [AkismetTestSubmission::class];
19
20
    protected $usesDatabase = true;
21
22
    protected static $required_extensions = [
23
        SiteConfig::class => [
24
            AkismetConfig::class,
25
        ],
26
    ];
27
28
    protected static $extra_controllers = [
29
        AkismetTestController::class,
30
    ];
31
32
    protected function setUp()
33
    {
34
        parent::setUp();
35
        Injector::inst()->unregisterObjects(AkismetService::class);
36
37
        // Mock service
38
        Config::modify()->set(Injector::class, AkismetService::class, AkismetTestService::class);
39
        Config::modify()->set(AkismetSpamProtector::class, 'api_key', 'dummykey');
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
        // 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
        try {
141
            // Remove AkismetKey field
142
            $siteconfigTable = DataObject::getSchema()->tableName(SiteConfig::class);
143
            DB::query('ALTER TABLE "' . $siteconfigTable . '" DROP COLUMN "AkismetKey"');
144
        } catch (DatabaseException $e) {
145
            $this->markTestSkipped('Could not DROP database column');
146
        }
147
        $this->assertFalse($processor->publicIsDBReady());
148
    }
149
}
150