From 735103c1205a60529f545ca83a9e5d9fbcc18185 Mon Sep 17 00:00:00 2001 From: oleibman Date: Sat, 25 Jul 2020 20:40:49 -0700 Subject: [PATCH] Improve Coverage for ODS Reader (#1545) * Improve Coverage for ODS Reader Reader/ODS/Properties is now 100% covered. Reader/ODS is covered except for 1 statement. As the original author put it, "table-header-rows TODO: figure this out ... I'm not sure that PhpExcel has an API for this". I'm still thinking about it, but, so far, I agree with the author. There are minimal code changes. - Several places test !zip->open() to see whether the test failed. However, zip->open() returns true or a string, so the test never detects failure. Change to zip->open() !== true. No previous tests. - Suppress warning messages from simplexml_load_string (there had been no tests for invalid xml). - One document property was misnamed, and one non-existent property was tested for. I added a number of tests, creating an ODS directory, and moving OdsTest to that directory. * Scrutinizer Recommendation Unused variable in one test. * Update CHANGELOG Co-authored-by: Adrien Crivelli --- CHANGELOG.md | 2 +- src/PhpSpreadsheet/Reader/Ods.php | 34 +++--- src/PhpSpreadsheet/Reader/Ods/Properties.php | 6 +- .../Reader/Ods/OdsInfoTest.php | 110 ++++++++++++++++++ .../Reader/{ => Ods}/OdsTest.php | 57 +++++++-- tests/data/Reader/Ods/corruptMeta.ods | Bin 0 -> 7196 bytes tests/data/Reader/Ods/data.ods | Bin 11764 -> 12182 bytes tests/data/Reader/Ods/nomimetype.ods | Bin 0 -> 7058 bytes 8 files changed, 175 insertions(+), 34 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Ods/OdsInfoTest.php rename tests/PhpSpreadsheetTests/Reader/{ => Ods}/OdsTest.php (83%) create mode 100644 tests/data/Reader/Ods/corruptMeta.ods create mode 100644 tests/data/Reader/Ods/nomimetype.ods diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d7b4ebe..d96323dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Changed -- Nothing. +- Improve Coverage for ODS Reader [#1545](https://github.com/phpoffice/phpspreadsheet/pull/1544) ### Deprecated diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index 4f164b6f..b2a6a759 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -11,6 +11,7 @@ use DOMNode; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Cell\DataType; +use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; use PhpOffice\PhpSpreadsheet\Reader\Ods\PageSettings; use PhpOffice\PhpSpreadsheet\Reader\Ods\Properties as DocumentProperties; use PhpOffice\PhpSpreadsheet\Reader\Security\XmlScanner; @@ -76,11 +77,9 @@ class Ods extends BaseReader } $zip->close(); - - return $mimeType === 'application/vnd.oasis.opendocument.spreadsheet'; } - return false; + return $mimeType === 'application/vnd.oasis.opendocument.spreadsheet'; } /** @@ -95,8 +94,8 @@ class Ods extends BaseReader File::assertFile($pFilename); $zip = new ZipArchive(); - if (!$zip->open($pFilename)) { - throw new Exception('Could not open ' . $pFilename . ' for reading! Error opening file.'); + if ($zip->open($pFilename) !== true) { + throw new ReaderException('Could not open ' . $pFilename . ' for reading! Error opening file.'); } $worksheetNames = []; @@ -149,8 +148,8 @@ class Ods extends BaseReader $worksheetInfo = []; $zip = new ZipArchive(); - if (!$zip->open($pFilename)) { - throw new Exception('Could not open ' . $pFilename . ' for reading! Error opening file.'); + if ($zip->open($pFilename) !== true) { + throw new ReaderException('Could not open ' . $pFilename . ' for reading! Error opening file.'); } $xml = new XMLReader(); @@ -198,18 +197,18 @@ class Ods extends BaseReader // Step into the row $xml->read(); do { + $doread = true; if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) { if (!$xml->isEmptyElement) { ++$currCells; $xml->next(); - } else { - $xml->read(); + $doread = false; } } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) { $mergeSize = $xml->getAttribute('table:number-columns-repeated'); $currCells += (int) $mergeSize; - $xml->read(); - } else { + } + if ($doread) { $xml->read(); } } while ($xml->name != 'table:table-row'); @@ -258,13 +257,13 @@ class Ods extends BaseReader $GMT = new DateTimeZone('UTC'); $zip = new ZipArchive(); - if (!$zip->open($pFilename)) { + if ($zip->open($pFilename) !== true) { throw new Exception("Could not open {$pFilename} for reading! Error opening file."); } // Meta - $xml = simplexml_load_string( + $xml = @simplexml_load_string( $this->securityScanner->scan($zip->getFromName('meta.xml')), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions() @@ -465,9 +464,10 @@ class Ods extends BaseReader $type = DataType::TYPE_NUMERIC; $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - if (floor($dataValue) == $dataValue) { - $dataValue = (int) $dataValue; - } + // percentage should always be float + //if (floor($dataValue) == $dataValue) { + // $dataValue = (int) $dataValue; + //} $formatting = NumberFormat::FORMAT_PERCENTAGE_00; break; @@ -488,8 +488,6 @@ class Ods extends BaseReader if (floor($dataValue) == $dataValue) { if ($dataValue == (int) $dataValue) { $dataValue = (int) $dataValue; - } else { - $dataValue = (float) $dataValue; } } diff --git a/src/PhpSpreadsheet/Reader/Ods/Properties.php b/src/PhpSpreadsheet/Reader/Ods/Properties.php index c0b309a9..d0a45e6a 100644 --- a/src/PhpSpreadsheet/Reader/Ods/Properties.php +++ b/src/PhpSpreadsheet/Reader/Ods/Properties.php @@ -54,15 +54,11 @@ class Properties $docProps->setLastModifiedBy($propertyValue); break; - case 'creation-date': + case 'date': $creationDate = strtotime($propertyValue); $docProps->setCreated($creationDate); $docProps->setModified($creationDate); - break; - case 'keyword': - $docProps->setKeywords($propertyValue); - break; case 'description': $docProps->setDescription($propertyValue); diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/OdsInfoTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/OdsInfoTest.php new file mode 100644 index 00000000..1de4252f --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Ods/OdsInfoTest.php @@ -0,0 +1,110 @@ +listWorksheetNames($filename)); + } + + public function testNoMimeType(): void + { + $filename = 'tests/data/Reader/Ods/nomimetype.ods'; + + // Load into this instance + $reader = new Ods(); + + self::assertTrue($reader->canRead($filename)); + } + + public function testReadBadFileProperties(): void + { + $this->expectException(ReaderException::class); + + // Load into this instance + $reader = new Ods(); + + // Test "listWorksheetNames" method + + self::assertEquals([ + 'Sheet1', + 'Second Sheet', + ], $reader->listWorksheetNames(__FILE__)); + } + + public function testReadFileInfo(): void + { + $filename = 'tests/data/Reader/Ods/data.ods'; + + // Load into this instance + $reader = new Ods(); + + // Test "listWorksheetNames" method + + $wsinfo = $reader->listWorkSheetInfo($filename); + self::assertEquals([ + [ + 'worksheetName' => 'Sheet1', + 'lastColumnLetter' => 'C', + 'lastColumnIndex' => 2, + 'totalRows' => 12, + 'totalColumns' => 3, + ], + [ + 'worksheetName' => 'Second Sheet', + 'lastColumnLetter' => 'A', + 'lastColumnIndex' => 0, + 'totalRows' => 2, + 'totalColumns' => 1, + ], + ], $wsinfo); + } + + public function testReadBadFileInfo(): void + { + $this->expectException(ReaderException::class); + $filename = __FILE__; + + // Load into this instance + $reader = new Ods(); + + // Test "listWorksheetNames" method + + $wsinfo = $reader->listWorkSheetInfo($filename); + self::assertEquals([ + [ + 'worksheetName' => 'Sheet1', + 'lastColumnLetter' => 'C', + 'lastColumnIndex' => 2, + 'totalRows' => 11, + 'totalColumns' => 3, + ], + [ + 'worksheetName' => 'Second Sheet', + 'lastColumnLetter' => 'A', + 'lastColumnIndex' => 0, + 'totalRows' => 2, + 'totalColumns' => 1, + ], + ], $wsinfo); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/OdsTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php similarity index 83% rename from tests/PhpSpreadsheetTests/Reader/OdsTest.php rename to tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php index 0aeb5570..8be1aa7c 100644 --- a/tests/PhpSpreadsheetTests/Reader/OdsTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/OdsTest.php @@ -1,9 +1,10 @@ spreadsheetData = $reader->loadIntoExisting($filename, new Spreadsheet()); + $this->spreadsheetData = $reader->load($filename); } return $this->spreadsheetData; } - public function testReadFileProperties(): void + public function testLoadWorksheets(): void + { + $spreadsheet = $this->loadDataFile(); + + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet); + + self::assertEquals(2, $spreadsheet->getSheetCount()); + + $firstSheet = $spreadsheet->getSheet(0); + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $firstSheet); + + $secondSheet = $spreadsheet->getSheet(1); + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $secondSheet); + self::assertEquals('Sheet1', $spreadsheet->getSheet(0)->getTitle()); + self::assertEquals('Second Sheet', $spreadsheet->getSheet(1)->getTitle()); + } + + public function testLoadOneWorksheet(): void { $filename = 'tests/data/Reader/Ods/data.ods'; // Load into this instance $reader = new Ods(); + $reader->setLoadSheetsOnly(['Sheet1']); + $spreadsheet = $reader->load($filename); - // Test "listWorksheetNames" method + self::assertEquals(1, $spreadsheet->getSheetCount()); - self::assertEquals([ - 'Sheet1', - 'Second Sheet', - ], $reader->listWorksheetNames($filename)); + self::assertEquals('Sheet1', $spreadsheet->getSheet(0)->getTitle()); } - public function testLoadWorksheets(): void + public function testLoadBadFile(): void { - $spreadsheet = $this->loadDataFile(); + $this->expectException(ReaderException::class); + $reader = new Ods(); + $spreadsheet = $reader->load(__FILE__); + + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet); + + self::assertEquals(2, $spreadsheet->getSheetCount()); + + $firstSheet = $spreadsheet->getSheet(0); + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $firstSheet); + + $secondSheet = $spreadsheet->getSheet(1); + self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Worksheet\Worksheet', $secondSheet); + } + + public function testLoadCorruptFile(): void + { + $this->expectException(ReaderException::class); + $filename = 'tests/data/Reader/Ods/corruptMeta.ods'; + $reader = new Ods(); + $spreadsheet = $reader->load($filename); self::assertInstanceOf('PhpOffice\PhpSpreadsheet\Spreadsheet', $spreadsheet); diff --git a/tests/data/Reader/Ods/corruptMeta.ods b/tests/data/Reader/Ods/corruptMeta.ods new file mode 100644 index 0000000000000000000000000000000000000000..146befd936ac7bdb297a0510182d56d6464a93de GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/tests/data/Reader/Ods/data.ods b/tests/data/Reader/Ods/data.ods index 3171eb6b7e31487b89848a91b89cae9adaa7ad35..2aaad631a8e4abc4dfdf9bf70d5d943220b516c0 100644 GIT binary patch literal 12182 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 WfIyVA;9fdBa3BjhtT)}Cp8o+`AV}N* diff --git a/tests/data/Reader/Ods/nomimetype.ods b/tests/data/Reader/Ods/nomimetype.ods new file mode 100644 index 0000000000000000000000000000000000000000..26d53847fa9feaf647b03898d8b89cdb05a3b194 GIT binary patch literal 7058 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 F{{VDZ14{q^ literal 0 HcmV?d00001