packages/sql-catalog/tests/Unit/Cli/ArtifactWriterTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Cli;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Cli\ArtifactWriter;
11use SqlCatalog\Cli\WriteFailureException;
12use SqlCatalog\Core\Reporter\CatalogArtifacts;
13
14#[CoversClass(ArtifactWriter::class)]
15#[UsesClass(CatalogArtifacts::class)]
16#[UsesClass(WriteFailureException::class)]
17final class ArtifactWriterTest extends TestCase
18{
19 public function testWriteCreatesTheDirectoryAndTheFiles(): void
20 {
21 $directory = sys_get_temp_dir() . '/sql-catalog-test-' . bin2hex(random_bytes(6)) . '/nested';
22 $written = (new ArtifactWriter())->write($directory, CatalogArtifacts::one('catalog.json', '{}'));
23 self::assertSame([$directory . '/catalog.json'], $written);
24 self::assertSame('{}', file_get_contents($written[0]));
25 unlink($written[0]);
26 rmdir($directory);
27 rmdir(dirname($directory));
28 }
29
30 public function testPrepareAcceptsADirectoryThatIsAlreadyThere(): void
31 {
32 (new ArtifactWriter())->prepare(sys_get_temp_dir());
33 self::assertDirectoryIsWritable(sys_get_temp_dir());
34 }
35
36 public function testWriteRefusesADirectoryItCannotCreate(): void
37 {
38 $blocking = sys_get_temp_dir() . '/sql-catalog-test-' . bin2hex(random_bytes(6));
39 file_put_contents($blocking, 'not a directory');
40 $this->expectException(WriteFailureException::class);
41 $this->expectExceptionMessage('a file of that name is in the way');
42 (new ArtifactWriter())->write($blocking, CatalogArtifacts::one('a.json', '{}'));
43 }
44}
45