Completed
Pull Request — master (#23)
by
unknown
06:33
created

AkismetTest::setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 14
rs 9.4285
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
39
        // Reset options to reasonable default
40
        Config::modify()->remove(AkismetSpamProtector::class, 'save_spam');
41
        Config::modify()->remove(AkismetSpamProtector::class, 'require_confirmation');
42
        Config::modify()->remove(AkismetSpamProtector::class, 'bypass_members');
43
        Config::modify()->set(AkismetSpamProtector::class, 'bypass_permission', 'ADMIN');
44
    }
45
46
    public function testSpamDetectionForm()
47
    {
48
        
49
        // Test "nice" setting
50
        $result = $this->post('AkismetTestController/Form', array(
51
            'Name' => 'person',
52
            'Email' => '[email protected]',
53
            'Content' => 'what a nice comment',
54
            'action_doSubmit' => 'Submit',
55
        ));
56
57
        $this->assertContains('Thanks for your submission, person', $result->getBody());
58
        $saved = AkismetTestSubmission::get()->last();
59
        $this->assertNotEmpty($saved);
60
        $this->assertEquals('person', $saved->Name);
61
        $this->assertEquals('[email protected]', $saved->Email);
62
        $this->assertEquals('what a nice comment', $saved->Content);
63
        $this->assertEquals(false, (bool)$saved->IsSpam);
64
        $saved->delete();
65
66
        // Test failed setting
67
        $result = $this->post('AkismetTestController/Form', array(
68
            'Name' => 'spam',
69
            'Email' => '[email protected]',
70
            'Content' => 'spam',
71
            'action_doSubmit' => 'Submit',
72
        ));
73
74
        $errorMessage = _t(
75
            'SilverStripe\\Akismet\\AkismetField.SPAM',
76
            "Your submission has been rejected because it was treated as spam."
77
        );
78
        $this->assertContains($errorMessage, $result->getBody());
79
        $saved = AkismetTestSubmission::get()->last();
80
        $this->assertEmpty($saved);
81
    }
82
83
    public function testSaveSpam()
84
    {
85
        Config::modify()->set(AkismetSpamProtector::class, 'save_spam', true);
86
87
        // Test "nice" setting
88
        $result = $this->post('AkismetTestController/Form', array(
89
            'Name' => 'person',
90
            'Email' => '[email protected]',
91
            'Content' => 'what a nice comment',
92
            'action_doSubmit' => 'Submit',
93
        ));
94
95
        $this->assertContains('Thanks for your submission, person', $result->getBody());
96
        $saved = AkismetTestSubmission::get()->last();
97
        $this->assertNotEmpty($saved);
98
        $this->assertEquals('person', $saved->Name);
99
        $this->assertEquals('[email protected]', $saved->Email);
100
        $this->assertEquals('what a nice comment', $saved->Content);
101
        $this->assertEquals(false, (bool)$saved->IsSpam);
102
        $saved->delete();
103
104
        $this->markTestIncomplete('@todo fix form validation message in AkismetField');
105
106
        // Test failed setting
107
        $result = $this->post('AkismetTestController/Form', array(
108
            'Name' => 'spam',
109
            'Email' => '[email protected]',
110
            'Content' => 'spam',
111
            'action_doSubmit' => 'Submit',
112
        ));
113
114
        $errorMessage = _t(
115
            'SilverStripe\\Akismet\\AkismetField.SPAM',
116
            "Your submission has been rejected because it was treated as spam."
117
        );
118
        $this->assertContains($errorMessage, $result->getBody());
119
        $saved = AkismetTestSubmission::get()->last();
120
        $this->assertNotEmpty($saved);
121
        $this->assertEquals('spam', $saved->Name);
122
        $this->assertEquals('[email protected]', $saved->Email);
123
        $this->assertEquals('spam', $saved->Content);
124
        $this->assertEquals(true, (bool)$saved->IsSpam);
125
    }
126
127
    /**
128
     * Test that the request processor can safely activate when able (and only then)
129
     */
130
    public function testProcessor()
131
    {
132
        $siteconfig = SiteConfig::current_site_config();
133
        $siteconfig->write();
134
135
        // Test assignment via request filter
136
        $processor = new AkismetTestTestMiddleware();
137
        $this->assertTrue($processor->publicIsDBReady());
138
139
        // Remove AkismetKey field
140
        DB::query('ALTER TABLE "SiteConfig" DROP COLUMN "AkismetKey"');
141
        $this->assertFalse($processor->publicIsDBReady());
142
    }
143
}
144