_filesystemMock = $this->createMock(\Magento\Framework\Filesystem::class); $this->_handleMock = $this->createMock(\Magento\Framework\Filesystem\File\ReadInterface::class); $this->_workingDirectoryMock = $this->createMock(\Magento\Framework\Filesystem\Directory\ReadInterface::class); $this->_downloadableFileMock = $this->createMock(\Magento\Downloadable\Helper\File::class); $this->sessionManager = $this->getMockForAbstractClass( \Magento\Framework\Session\SessionManagerInterface::class ); $this->fileReadFactory = $this->createMock(\Magento\Framework\Filesystem\File\ReadFactory::class); $this->_helper = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( \Magento\Downloadable\Helper\Download::class, [ 'downloadableFile' => $this->_downloadableFileMock, 'filesystem' => $this->_filesystemMock, 'session' => $this->sessionManager, 'fileReadFactory' => $this->fileReadFactory, ] ); } /** * @expectedException \InvalidArgumentException */ public function testSetResourceInvalidPath() { $this->_helper->setResource('/some/path/../file', DownloadHelper::LINK_TYPE_FILE); } /** * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage Please set resource file and link type. */ public function testGetFileSizeNoResource() { $this->_helper->getFileSize(); } /** * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage Invalid download link type. */ public function testGetFileSizeInvalidLinkType() { $this->_helper->setResource(self::FILE_PATH, 'The link type is invalid. Verify and try again.'); $this->_helper->getFileSize(); } public function testGetFileSizeUrl() { $this->_setupUrlMocks(); $this->assertEquals(self::FILE_SIZE, $this->_helper->getFileSize()); } public function testGetFileSize() { $this->_setupFileMocks(); $this->assertEquals(self::FILE_SIZE, $this->_helper->getFileSize()); } /** * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage Invalid download link type. */ public function testGetFileSizeNoFile() { $this->_setupFileMocks(false); $this->_helper->getFileSize(); } public function testGetContentType() { $this->_setupFileMocks(); $this->_downloadableFileMock->expects($this->never())->method('getFileType'); $this->assertEquals(self::MIME_TYPE, $this->_helper->getContentType()); } /** * @dataProvider dataProviderForTestGetContentTypeThroughHelper */ public function testGetContentTypeThroughHelper($functionExistsResult, $mimeContentTypeResult) { $this->_setupFileMocks(); self::$functionExists = $functionExistsResult; self::$mimeContentType = $mimeContentTypeResult; $this->_downloadableFileMock->expects( $this->once() )->method( 'getFileType' )->will( $this->returnValue(self::MIME_TYPE) ); $this->assertEquals(self::MIME_TYPE, $this->_helper->getContentType()); } /** * @return array */ public function dataProviderForTestGetContentTypeThroughHelper() { return [[false, ''], [true, false]]; } public function testGetContentTypeUrl() { $this->_setupUrlMocks(); $this->assertEquals(self::MIME_TYPE, $this->_helper->getContentType()); } public function testGetFilename() { $baseName = 'base_name.file'; $path = TESTS_TEMP_DIR . '/' . $baseName; $this->_setupFileMocks(true, self::FILE_SIZE, $path); $this->assertEquals($baseName, $this->_helper->getFilename()); } public function testGetFileNameUrl() { $this->_setupUrlMocks(); $this->assertEquals('example.com', $this->_helper->getFilename()); } public function testGetFileNameUrlWithContentDisposition() { $fileName = 'some_other.file'; $this->_setupUrlMocks(self::FILE_SIZE, self::URL, ['disposition' => "inline; filename={$fileName}"]); $this->assertEquals($fileName, $this->_helper->getFilename()); } /** * @param bool $doesExist * @param int $size * @param string $path */ protected function _setupFileMocks($doesExist = true, $size = self::FILE_SIZE, $path = self::FILE_PATH) { $this->_handleMock->expects($this->any())->method('stat')->will($this->returnValue(['size' => $size])); $this->_downloadableFileMock->expects($this->any())->method('ensureFileInFilesystem')->with($path) ->will($this->returnValue($doesExist)); $this->_workingDirectoryMock->expects($doesExist ? $this->once() : $this->never())->method('openFile') ->will($this->returnValue($this->_handleMock)); $this->_filesystemMock->expects($this->any())->method('getDirectoryRead')->with(DirectoryList::MEDIA) ->will($this->returnValue($this->_workingDirectoryMock)); $this->_helper->setResource($path, DownloadHelper::LINK_TYPE_FILE); } /** * @param int $size * @param string $url * @param array $additionalStatData */ protected function _setupUrlMocks($size = self::FILE_SIZE, $url = self::URL, $additionalStatData = []) { $this->_handleMock->expects( $this->any() )->method( 'stat' )->will( $this->returnValue(array_merge(['size' => $size, 'type' => self::MIME_TYPE], $additionalStatData)) ); $this->fileReadFactory->expects( $this->once() )->method( 'create' )->will( $this->returnValue($this->_handleMock) ); $this->_helper->setResource($url, DownloadHelper::LINK_TYPE_URL); } public function testOutput() { $this->sessionManager ->expects($this->once())->method('writeClose'); $this->_setupUrlMocks(self::FILE_SIZE, self::URL, ['disposition' => "inline; filename=test.txt"]); $this->_helper->output(); } }