Completed
Push — master ( b02bf5...0db1da )
by Loz
12s
created

GenerateCSVJobTest::createJob()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 2
1
<?php
2
3
namespace SilverStripe\GridFieldQueuedExport\Tests;
4
5
use SilverStripe\Assets\Filesystem;
6
use SilverStripe\Control\Director;
7
use SilverStripe\Core\Config\Config;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\Forms\GridField\GridField;
10
use SilverStripe\GridfieldQueuedExport\Jobs\GenerateCSVJob;
11
12
class GenerateCSVJobTest extends SapphireTest
13
{
14
15
    protected static $fixture_file = 'GenerateCSVJobTest.yml';
16
17
    protected static $extra_dataobjects = [GenerateCSVJobTestRecord::class];
18
19
    protected static $extra_controllers = [GenerateCSVJobTestController::class];
20
21
    protected function setUp()
22
    {
23
        parent::setUp();
24
25
        Config::modify()->merge(Director::class, 'rules', [
26
            'jobtest//$Action/$ID/$OtherID' => GenerateCSVJobTestController::class
27
        ]);
28
    }
29
30
    protected $paths = [];
31
32
    protected function tearDown()
33
    {
34
        foreach ($this->paths as $path) {
35
            Filesystem::removeFolder(dirname($path));
36
        }
37
        parent::tearDown();
38
    }
39
40
    public function testGenerateExport()
41
    {
42
        // Build session
43
        $memberID = $this->logInWithPermission('ADMIN');
44
        $session = ['loggedInAs' => $memberID];
45
46
        // Build controller
47
        $controller = new GenerateCSVJobTestController();
48
        $form = $controller->Form();
49
        $gridfield = $form->Fields()->fieldByName('MyGridfield');
50
51
        // Build job
52
        $job = $this->createJob($gridfield, $session);
53
        $path = sprintf('%1$s/.exports/%2$s/%2$s.csv', ASSETS_PATH, $job->getSignature());
54
        $this->paths[] = $path; // Mark for cleanup later
55
56
        // Test that the job runs
57
        $this->assertFileNotExists($path);
58
        $job->setup();
59
        $job->process();
60
        $job->afterComplete();
61
        $this->assertFileExists($path);
62
63
        // Test that the output matches the expected
64
        $expected = [
65
            'Title,Content,"Publish On"',
66
            '"Record 1","<p>""Record 1"" Body</p>","2015-01-01 23:34:01"',
67
            '"Record 2","<p>""Record 2"" Body</p>","2015-01-02 23:34:01"',
68
            '"Record 3","<p>""Record 3"" Body</p>","2015-01-03 23:34:01"',
69
            '',
70
        ];
71
        $actual = file_get_contents($path);
72
        $this->assertEquals(implode("\r\n", $expected), $actual);
73
    }
74
75
    public function testGenerateExportOverMultipleSteps()
76
    {
77
        Config::modify()->set(GenerateCSVJob::class, 'chunk_size', 1);
78
79
        // Build session
80
        $memberID = $this->logInWithPermission('ADMIN');
81
        $session = ['loggedInAs' => $memberID];
82
83
        // Build controller
84
        $controller = new GenerateCSVJobTestController();
85
        $form = $controller->Form();
86
        /** @var GridField $gridfield */
87
        $gridfield = $form->Fields()->fieldByName('MyGridfield');
88
89
        // Build job
90
        $job = $this->createJob($gridfield, $session);
91
        $path = sprintf('%1$s/.exports/%2$s/%2$s.csv', ASSETS_PATH, $job->getSignature());
92
        $this->paths[] = $path; // Mark for cleanup later
93
94
        // Test that the job runs
95
        $this->assertFileNotExists($path);
96
        $count = 0;
97
        while (!$job->jobFinished()) {
98
            ++$count;
99
            if ($job->currentStep) {
100
                $job->prepareForRestart();
101
            } else {
102
                $job->setup();
103
            }
104
            $job->process();
105
        }
106
        $job->afterComplete();
107
        $this->assertFileExists($path);
108
        $this->assertEquals(3, $count);
109
110
        // Test that the output matches the expected
111
        $expected = [
112
            'Title,Content,"Publish On"',
113
            '"Record 1","<p>""Record 1"" Body</p>","2015-01-01 23:34:01"',
114
            '"Record 2","<p>""Record 2"" Body</p>","2015-01-02 23:34:01"',
115
            '"Record 3","<p>""Record 3"" Body</p>","2015-01-03 23:34:01"',
116
            '',
117
        ];
118
        $actual = file_get_contents($path);
119
        $this->assertEquals(implode("\r\n", $expected), $actual);
120
    }
121
122
    /**
123
     * Rough copy of GridFieldQueuedExportButton::startExport
124
     *
125
     * @param GridField $gridField
126
     * @param array $session
127
     * @return GenerateCSVJob
128
     */
129
    protected function createJob($gridField, $session)
130
    {
131
        $job = new GenerateCSVJob();
132
        $job->setGridField($gridField);
133
        $job->setSession($session);
134
        $job->setSeparator(',');
135
        $job->setIncludeHeader(true);
136
        return $job;
137
    }
138
}
139