Passed
Push — master ( 6998a3...224daf )
by Daniel
02:08
created

WriterTest::testWriteCsvDifferentLineEndings()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
/**
4
 * This file is part of the Csv-Machine package.
5
 *
6
 * (c) Dan McAdams <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace RoadBunch\Csv\Tests\Csv;
13
14
use PHPUnit\Framework\TestCase;
15
use RoadBunch\Csv;
16
17
/**
18
 * Class WriterTest
19
 *
20
 * @author  Dan McAdams
21
 * @package RoadBunch\Csv\Tests\Csv
22
 */
23
class WriterTest extends TestCase
24
{
25
    protected $filename;
26
27
    public function setUp()
28
    {
29
        $this->filename = sprintf('%s/%s.csv', __DIR__, md5(uniqid()));
30
    }
31
32
    public function tearDown()
33
    {
34
        if (is_file($this->filename)) {
35
            unlink($this->filename);
36
        }
37
    }
38
39
    public function testAddRow()
40
    {
41
        $writer = new WriterSpy();
42
        $rowOne = ['Dan', 'McAdams'];
43
        $rowTwo = ['Lara', 'McAdams'];
44
45
        $writer->addRow($rowOne);
46
        $writer->addRow($rowTwo);
47
48
        $this->assertCount(2, $writer->getRows());
49
    }
50
51
    public function testAddRowsNotArrayOfArrays()
52
    {
53
        $this->expectException(Csv\Exception\InvalidInputArrayException::class);
54
        $writer = new Csv\Writer();
55
        $rows   = ['Dan', 'McAdams'];
56
57
        $writer->addRows($rows);
58
    }
59
60
    public function testAddRows()
61
    {
62
        $writer = new WriterSpy();
63
        $rows   = [
64
            ['Dan', 'McAdams'],
65
            ['Lara', 'McAdams'],
66
            ['Test', 'User']
67
        ];
68
        $writer->addRows($rows);
69
        $moreRows = [
70
            ['more1', 'row1'],
71
            ['more2', 'row2'],
72
            ['more3', 'row3']
73
        ];
74
        $writer->addRows($moreRows);
75
        $this->assertCount(6, $writer->getRows());
76
77
        return $writer;
78
    }
79
80
    public function testSetHeader()
81
    {
82
        $header = ['first_name', 'last_name'];
83
84
        $writer = new WriterSpy();
85
        $writer->setHeader($header);
86
87
        $this->assertInstanceOf(Csv\Header\HeaderInterface::class, $writer->getHeader());
88
    }
89
90
    public function testSetHeaderWithFormatters()
91
    {
92
        $writer = new Csv\Writer();
93
        $rows   = ['fname_one', 'lname_one', '[email protected]'];
94
        $writer->addRow($rows);
95
96
        $header = ['first_name', 'last_name', 'email_address'];
97
        $expectedFormattedHeader = ['First Name', 'Last Name', 'Email Address'];
98
        $formatters = [
99
            Csv\Formatter\UnderscoreToSpaceFormatter::class,
100
            Csv\Formatter\UpperCaseWordsFormatter::class
101
        ];
102
        $writer->setHeader($header, $formatters);
103
104
        $writer->saveToFile($this->filename);
105
        $this->assertCsvWrittenToFile($expectedFormattedHeader, [$rows]);
106
    }
107
108
    public function testThrowExceptionWhenCantOpenFile()
109
    {
110
        $this->expectException(\Exception::class);
111
112
        $writer = new Csv\Writer();
113
        error_reporting(0);
114
        $writer->saveToFile('');
115
        error_reporting(1);
116
    }
117
118
    public function testWriteCsvToFile()
119
    {
120
        $header = ['first_name', 'last_name', 'email_address'];
121
        $rows   = [
122
            ['fname_one', 'lname_one', '[email protected]'],
123
            ['fname_two', 'lname_two', '[email protected]'],
124
            ['fname_three', 'lname_three', '[email protected]']
125
        ];
126
        $writer = new Csv\Writer();
127
        $writer->setHeader($header);
128
        $writer->addRow();
129
        $writer->addRows($rows);
130
        $writer->saveToFile($this->filename);
131
132
        $handle = fopen($this->filename, 'r');
133
        $this->assertEquals($header, fgetcsv($handle));
134
        fclose($handle);
135
136
        return $writer;
137
    }
138
139
    /**
140
     * @depends testWriteCsvToFile
141
     */
142
    public function testWriteCsvToNonSeekableStream(Csv\WriterInterface $writer)
143
    {
144
        $header = ['first_name', 'last_name', 'email_address'];
145
        $writer->setHeader($header);
146
147
        ob_start();
148
        $writer->saveToFile('php://output');
149
        $output = ob_get_clean();
150
151
        $this->assertContains(implode(',', $header), $output);
152
    }
153
154
    /**
155
     * @depends testWriteCsvToFile
156
     */
157
    public function testWriteToString(Csv\WriterInterface $writer)
158
    {
159
        $header = ['first_name', 'last_name', 'email_address'];
160
        $writer->setHeader($header);
161
162
        $this->assertContains(implode(',', $header), $writer->writeToString());
163
    }
164
165
    /**
166
     * @depends testWriteCsvToFile
167
     */
168
    public function testWriteCsvDifferentLineEndings(Csv\Writer $writer)
169
    {
170
        $writer->setNewline(Csv\Newline::NEWLINE_CRLF);
171
        $writer->saveToFile($this->filename);
172
        $this->assertLineEnding(Csv\Newline::NEWLINE_CRLF);
173
    }
174
175
    private function assertCsvWrittenToFile($header, $rows)
176
    {
177
        $this->assertGreaterThan(0, filesize($this->filename), 'No data written to file');
178
179
        $handle = fopen($this->filename, 'r');
180
        $this->assertEquals($header, fgetcsv($handle));
181
182
        foreach ($rows as $row) {
183
            $this->assertEquals($row, fgetcsv($handle));
184
        }
185
186
        fclose($handle);
187
    }
188
189
    private function assertLineEnding($lineEnding)
190
    {
191
        $line = fgets(fopen($this->filename, 'r'));
192
        $this->assertEquals($lineEnding, substr($line, -2));
193
    }
194
}
195