Completed
Push — master ( d86ad0...519833 )
by Todd
04:01
created

CsvToMysqlTest::forceSingleLine()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
c 0
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace LogikosTest\Csv\CsvToMysql;
4
5
use Logikos\Csv\CsvToMysql\LoadDataInFile;
6
7
class CsvToMysqlTest extends TestCase {
8
  const DB_NAME_AND_TABLE = 'staging.people';
9
10
  public function testLoadDataInFile() {
11
    $this->assertInstanceOf(LoadDataInFile::class, new LoadDataInFile());
12
  }
13
14
  /** @dataProvider delimiters */
15
  public function testSetAndGetDelimiter($delimiter) {
16
    $ld = new LoadDataInFile();
17
    $ld->setDelimiter($delimiter);
18
    $this->assertSame($delimiter, $ld->getDelimiter());
19
  }
20
  public function delimiters() { return [[','], ["\t"], ['|']]; }
21
22
  /** @dataProvider enclosures */
23
  public function testSetAndGetEnclosure($enclosure) {
24
    $ld = new LoadDataInFile();
25
    $ld->setEnclosure($enclosure);
26
    $this->assertSame($enclosure, $ld->getEnclosure());
27
  }
28
  public function enclosures() { return [['"'], ['\''], ['`']]; }
29
30
  /** @dataProvider escapes */
31
  public function testSetAndGetEscape($escape) {
32
    $ld = new LoadDataInFile();
33
    $ld->setEscape($escape);
34
    $this->assertSame($escape, $ld->getEscape());
35
  }
36
  public function escapes() { return [['\\'], ['`']]; }
37
38
  /** @dataProvider ignoreLines */
39
  public function testSetAndGetIgnoreLines($lines) {
40
    $ld = new LoadDataInFile();
41
    $ld->setIgnoreLines($lines);
42
    $this->assertSame($lines, $ld->getIgnoreLines());
43
  }
44
  public function ignoreLines() { return [[0], [1], [2]]; }
45
46
  public function testDefaults() {
47
    $ld = new LoadDataInFile();
48
    $this->assertSame(',',   $ld->getDelimiter());
49
    $this->assertSame('"',   $ld->getEnclosure());
50
    $this->assertSame('\\',  $ld->getEscape());
51
    $this->assertSame('\\n', $ld->getEOL());
52
    $this->assertSame(0,     $ld->getIgnoreLines());
53
  }
54
55
  public function testSetAndGetTableName() {
56
    $ld = new LoadDataInFile();
57
    $ld->setTableName(self::DB_NAME_AND_TABLE);
58
    $this->assertSame(self::DB_NAME_AND_TABLE, $ld->getTableName());
59
  }
60
61
  public function testSetAndGetEOL() {
62
    $ld = new LoadDataInFile();
63
    $ld->setEOL(";");
64
    $this->assertSame(";", $ld->getEOL());
65
  }
66
67
  public function testSetAndGetCsvFile() {
68
    $csvFile = $this->csvFile();
69
    $ld = new LoadDataInFile();
70
    $ld->setCsvFile($csvFile);
71
    $this->assertSame($csvFile, $ld->getCsvFile());
72
  }
73
74
  public function testCsvFileMustBeReadable() {
75
    $csvFile = realpath(__DIR__.'/this-file-does-not-exist.csv');
76
    $this->expectException(\Exception::class);
77
    $ld = new LoadDataInFile();
78
    $ld->setCsvFile($csvFile);
79
  }
80
81
  public function testSQL() {
82
    $file = $this->csvFile();
83
84
    $ld = new LoadDataInFile();
85
    $ld->setCsvFile($file);
86
    $ld->setTableName(self::DB_NAME_AND_TABLE);
87
    $ld->setIgnoreLines(2);
88
89
    $expectedSql  = "
90
      LOAD DATA LOCAL INFILE {$file} INTO TABLE ".self::DB_NAME_AND_TABLE."
91
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\'
92
      LINES TERMINATED BY '\\n' IGNORE 2 LINES
93
    ";
94
95
    $this->assertSame(
96
        $this->normalizeWhitespace($expectedSql),
97
        $this->normalizeWhitespace($ld->getQuery())
98
    );
99
  }
100
101
  protected function normalizeWhitespace($string) {
102
    return trim(
103
        $this->forceSingleSpaces(
104
            $this->forceSingleLine($string)
105
        )
106
    );
107
  }
108
  protected function forceSingleSpaces($string) {
109
    return preg_replace('/ {2,}/', ' ', $string);
110
  }
111
  protected function forceSingleLine($string) {
112
    return str_replace(PHP_EOL, ' ', $string);
113
  }
114
115
  protected function csvFile() {
116
    $csvFile = $this->buildCsvFromArray([
117
        ['name', 'age'],
118
        ['adam', 30],
119
        ['bob',  31],
120
        ['cody', 32]
121
    ]);
122
    return $csvFile;
123
  }
124
125
}