diff --git a/tests/Feature/EnumMakeTest.php b/tests/Feature/EnumMakeTest.php index 36bec3e..37cbe8d 100644 --- a/tests/Feature/EnumMakeTest.php +++ b/tests/Feature/EnumMakeTest.php @@ -30,7 +30,7 @@ Enums::setBasePath(__DIR__ . '/../Skeleton'); Enums::setPaths('app/Enums', 'domain/*/Enums'); - expect(fn() => runEnum("make \"{$enum}\" CaseOne CaseTwo --backed={$backed}"))->toGenerate($enum); + expect(fn() => runEnum("make \"{$enum}\" CaseOne CaseTwo --backed={$backed}"))->toGenerate($enum, cli: true); (fn() => self::$paths = [])->bindTo(null, Enums::class)(); (fn() => self::$basePath = null)->bindTo(null, Enums::class)(); diff --git a/tests/Feature/EnumTsTest.php b/tests/Feature/EnumTsTest.php new file mode 100644 index 0000000..5373d36 --- /dev/null +++ b/tests/Feature/EnumTsTest.php @@ -0,0 +1,34 @@ +output->toContain('No enums to synchronize.') + ->status->toBe(0); +}); + +it('warns that no enums were synced if no enums can be found', function() { + expect(runEnum('ts --all')) + ->output->toContain('No enums to synchronize.') + ->status->toBe(0); +}); + +it('synchronizes all the discoverable enums', function() { + Enums::setBasePath(__DIR__ . '/../Skeleton'); + Enums::setPaths('app/Enums', 'domain/*/Enums'); + + expect($namespaces = [...Enums::namespaces()])->toBe([ + App\Enums\Enum1::class, + App\Enums\Enum2::class, + Domain\Common\Enums\Enum3::class, + Domain\Payouts\Enums\Enum4::class, + ]); + + $enums = array_map(fn($namespace) => "\"{$namespace}\"", $namespaces); + + expect(fn() => runEnum('ts ' . implode(' ', $enums)))->toTypeScript($namespaces); + + (fn() => self::$paths = [])->bindTo(null, Enums::class)(); + (fn() => self::$basePath = null)->bindTo(null, Enums::class)(); +}); diff --git a/tests/Integration/TypeScriptTest.php b/tests/Integration/TypeScriptTest.php new file mode 100644 index 0000000..f6fee9d --- /dev/null +++ b/tests/Integration/TypeScriptTest.php @@ -0,0 +1,58 @@ +sync())->toBeTrue(); + } + + expect(fn() => (new TypeScript('Domain\Payouts\Enums\Enum4'))->sync())->toTypeScript([$enum]); + + (fn() => self::$basePath = null)->bindTo(null, Enums::class)(); +}); + +it('replaces enums', function() { + Enums::setBasePath(__DIR__ . '/../Skeleton'); + + $enums = [ + App\Enums\Enum1::class, + App\Enums\Enum2::class, + Domain\Common\Enums\Enum3::class, + Domain\Payouts\Enums\Enum4::class, + ]; + + foreach ($enums as $enum) { + expect((new TypeScript($enum))->sync())->toBeTrue(); + } + + expect(fn() => (new TypeScript('Domain\Payouts\Enums\Enum4'))->sync(overwrite: true))->toTypeScript([$enum]); + + (fn() => self::$basePath = null)->bindTo(null, Enums::class)(); +}); + +it('creates custom TypeScript files', function(string $enum) { + Enums::setBasePath(__DIR__ . '/../Skeleton'); + Enums::setTypeScript(fn (string $enum) => 'resources/js/enums/' . className($enum) . '.ts'); + + expect(fn() => (new TypeScript($enum))->sync())->toTypeScript([$enum], oneFile: false); + + (fn() => self::$typeScript = 'resources/js/enums/index.ts')->bindTo(null, Enums::class)(); + (fn() => self::$basePath = null)->bindTo(null, Enums::class)(); +})->with([ + App\Enums\Enum1::class, + App\Enums\Enum2::class, + Domain\Common\Enums\Enum3::class, + Domain\Payouts\Enums\Enum4::class, +]); diff --git a/tests/Pest.php b/tests/Pest.php index 4fd6c0f..077d79f 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -24,9 +24,12 @@ | */ +use Cerbero\Enum\Enums; + use function Cerbero\Enum\className; use function Cerbero\Enum\cli; use function Cerbero\Enum\namespaceToPath; +use function Cerbero\Enum\path; expect()->extend('toAnnotate', function (array $enums, bool $overwrite = false) { $oldContents = []; @@ -38,13 +41,7 @@ } try { - if (is_bool($value = ($this->value)())) { - expect($value)->toBeTrue(); - } else { - expect($value) - ->output->toContain(...$enums) - ->status->toBe(0); - } + expect($this->value)->toProcessEnums($enums); foreach ($oldContents as $filename => $oldContent) { $stub = __DIR__ . '/stubs/annotate/' . basename($filename, '.php') . '.stub'; @@ -53,11 +50,7 @@ $stub = $path; } - // normalize content to avoid end-of-line incompatibility between OS - $enumContent = str_replace("\r\n", "\n", file_get_contents($filename)); - $stubContent = str_replace("\r\n", "\n", file_get_contents($stub)); - - expect($enumContent)->toBe($stubContent); + expect($filename)->toContainIgnoreEol($stub); } } finally { foreach ($oldContents as $filename => $oldContent) { @@ -66,35 +59,61 @@ } }); -expect()->extend('toGenerate', function (string $enum) { - expect(class_exists($enum))->toBeFalse(); +expect()->extend('toProcessEnums', function (array $enums) { + $value = ($this->value)(); + + if (is_bool($value)) { + expect($value)->toBeTrue(); + } else { + expect($value) + ->output->toContain(...$enums) + ->status->toBe(0); + } +}); + +expect()->extend('toContainIgnoreEol', function (string $path) { + // normalize content to avoid end-of-line incompatibility between OS + $actualContent = str_replace("\r\n", "\n", file_get_contents(path($this->value))); + $expectedContent = str_replace("\r\n", "\n", file_get_contents(path($path))); + + expect($actualContent)->toBe($expectedContent); +}); - $directory = 'make'; +expect()->extend('toGenerate', function (string $enum, bool $cli = false) { + expect(class_exists($enum))->toBeFalse(); try { - if (is_bool($value = ($this->value)())) { - expect($value)->toBeTrue(); - - $directory = 'generator'; - } else { - expect($value) - ->output->toContain($enum) - ->status->toBe(0); - } + expect($this->value)->toProcessEnums([$enum]); $filename = namespaceToPath($enum); + $directory = $cli ? 'make' : 'generator'; $stub = sprintf('%s/stubs/%s/%s.stub', __DIR__, $directory, className($enum)); - // normalize content to avoid end-of-line incompatibility between OS - $enumContent = str_replace("\r\n", "\n", file_get_contents($filename)); - $stubContent = str_replace("\r\n", "\n", file_get_contents($stub)); - - expect($enumContent)->toBe($stubContent); + expect($filename)->toContainIgnoreEol($stub); } finally { file_exists($filename) && unlink($filename); } }); +expect()->extend('toTypeScript', function (array $enums, bool $oneFile = true) { + expect($this->value)->toProcessEnums($enums); + + $paths = []; + + try { + foreach ($enums as $enum) { + $paths[] = $path = Enums::basePath(Enums::typeScript($enum)); + $stub = sprintf('%s/stubs/ts/%s.stub', __DIR__, $oneFile ? 'enums' : className($enum)); + + expect($path)->toContainIgnoreEol($stub); + } + } finally { + foreach ($paths as $path) { + file_exists($path) && unlink($path); + } + } +}); + /* |-------------------------------------------------------------------------- | Functions @@ -113,9 +132,11 @@ */ function runEnum(string $command): stdClass { + $paths = sprintf('--base-path="%s" --paths="%s"', Enums::basePath(), implode(',', Enums::paths())); + ob_start(); - cli($command, $status); + cli("{$command} {$paths}", $status); $output = ob_get_clean(); diff --git a/tests/stubs/ts/Enum1.stub b/tests/stubs/ts/Enum1.stub new file mode 100644 index 0000000..fbe83ba --- /dev/null +++ b/tests/stubs/ts/Enum1.stub @@ -0,0 +1,5 @@ +export enum Enum1 { + One = 1, + Two = 2, + Three = 3, +} diff --git a/tests/stubs/ts/Enum2.stub b/tests/stubs/ts/Enum2.stub new file mode 100644 index 0000000..84b47f0 --- /dev/null +++ b/tests/stubs/ts/Enum2.stub @@ -0,0 +1,3 @@ +export enum Enum2 { + +} diff --git a/tests/stubs/ts/Enum3.stub b/tests/stubs/ts/Enum3.stub new file mode 100644 index 0000000..43b0cda --- /dev/null +++ b/tests/stubs/ts/Enum3.stub @@ -0,0 +1,5 @@ +export enum Enum3 { + One = 'number 1', + Two = 'number 2', + Three = 'number 3', +} diff --git a/tests/stubs/ts/Enum4.stub b/tests/stubs/ts/Enum4.stub new file mode 100644 index 0000000..d37f484 --- /dev/null +++ b/tests/stubs/ts/Enum4.stub @@ -0,0 +1,5 @@ +export enum Enum4 { + One = 1, + Two = 2, + Three = 4, +} diff --git a/tests/stubs/ts/enums.stub b/tests/stubs/ts/enums.stub new file mode 100644 index 0000000..74c767e --- /dev/null +++ b/tests/stubs/ts/enums.stub @@ -0,0 +1,21 @@ +export enum Enum1 { + One = 1, + Two = 2, + Three = 3, +} + +export enum Enum2 { + +} + +export enum Enum3 { + One = 'number 1', + Two = 'number 2', + Three = 'number 3', +} + +export enum Enum4 { + One = 1, + Two = 2, + Three = 4, +}