createMock(Factory::class); $this->appData = $this->createMock(AppData::class); $factory->expects($this->once()) ->method('get') ->with('js') ->willReturn($this->appData); /** @var ITimeFactory|\PHPUnit\Framework\MockObject\MockObject $timeFactory */ $timeFactory = $this->createMock(ITimeFactory::class); $timeFactory->method('getTime') ->willReturn(1337); $this->request = $this->createMock(IRequest::class); $this->controller = new JsController( 'core', $this->request, $factory, $timeFactory ); } public function testNoCssFolderForApp(): void { $this->appData->method('getFolder') ->with('myapp') ->willThrowException(new NotFoundException()); $result = $this->controller->getJs('file.css', 'myapp'); $this->assertInstanceOf(NotFoundResponse::class, $result); } public function testNoCssFile(): void { $folder = $this->createMock(ISimpleFolder::class); $this->appData->method('getFolder') ->with('myapp') ->willReturn($folder); $folder->method('getFile') ->willThrowException(new NotFoundException()); $result = $this->controller->getJs('file.css', 'myapp'); $this->assertInstanceOf(NotFoundResponse::class, $result); } public function testGetFile(): void { $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $file->method('getName')->willReturn('my name'); $file->method('getMTime')->willReturn(42); $this->appData->method('getFolder') ->with('myapp') ->willReturn($folder); $folder->method('getFile') ->with('file.js') ->willReturn($file); $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'application/javascript']); $expected->addHeader('Cache-Control', 'max-age=31536000, immutable'); $expires = new \DateTime(); $expires->setTimestamp(1337); $expires->add(new \DateInterval('PT31536000S')); $expected->addHeader('Expires', $expires->format(\DateTime::RFC1123)); $result = $this->controller->getJs('file.js', 'myapp'); $this->assertEquals($expected, $result); } public function testGetGzipFile(): void { $folder = $this->createMock(ISimpleFolder::class); $gzipFile = $this->createMock(ISimpleFile::class); $gzipFile->method('getName')->willReturn('my name'); $gzipFile->method('getMTime')->willReturn(42); $this->appData->method('getFolder') ->with('myapp') ->willReturn($folder); $folder->method('getFile') ->with('file.js.gzip') ->willReturn($gzipFile); $this->request->method('getHeader') ->with('Accept-Encoding') ->willReturn('gzip, deflate'); $expected = new FileDisplayResponse($gzipFile, Http::STATUS_OK, ['Content-Type' => 'application/javascript']); $expected->addHeader('Content-Encoding', 'gzip'); $expected->addHeader('Cache-Control', 'max-age=31536000, immutable'); $expires = new \DateTime(); $expires->setTimestamp(1337); $expires->add(new \DateInterval('PT31536000S')); $expected->addHeader('Expires', $expires->format(\DateTime::RFC1123)); $result = $this->controller->getJs('file.js', 'myapp'); $this->assertEquals($expected, $result); } public function testGetGzipFileNotFound(): void { $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $file->method('getName')->willReturn('my name'); $file->method('getMTime')->willReturn(42); $this->appData->method('getFolder') ->with('myapp') ->willReturn($folder); $folder->method('getFile') ->willReturnCallback( function ($fileName) use ($file) { if ($fileName === 'file.js') { return $file; } throw new NotFoundException(); } ); $this->request->method('getHeader') ->with('Accept-Encoding') ->willReturn('gzip, deflate'); $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'application/javascript']); $expected->addHeader('Cache-Control', 'max-age=31536000, immutable'); $expires = new \DateTime(); $expires->setTimestamp(1337); $expires->add(new \DateInterval('PT31536000S')); $expected->addHeader('Expires', $expires->format(\DateTime::RFC1123)); $result = $this->controller->getJs('file.js', 'myapp'); $this->assertEquals($expected, $result); } }