@@ -11,6 +11,8 @@ use Nette\Bridges\HttpDI\HttpExtension;
1111use Nette \DI \Compiler ;
1212use Nette \DI \Container ;
1313use Nette \DI \ContainerLoader ;
14+ use Nette \DI \MissingServiceException ;
15+ use Nette \DI \ServiceCreationException ;
1416use Symfony \Component \Console \Command \Command ;
1517use Tester \Assert ;
1618use Tester \FileMock ;
@@ -71,9 +73,96 @@ test(function (): void {
7173 Assert::equal ('https://contributte.org/ ' , (string ) $ container ->getService ('http.request ' )->getUrl ());
7274});
7375
74- // No CLI mode
76+ // No mode provided
7577test (function (): void {
7678 Assert::exception (function (): void {
7779 new ConsoleExtension ();
7880 }, InvalidArgumentException::class, 'Provide CLI mode, e.q. Contributte\Console\DI\ConsoleExtension(%consoleMode%). ' );
7981});
82+
83+ // Non-CLI mode
84+ test (function (): void {
85+ $ loader = new ContainerLoader (TEMP_DIR , true );
86+ $ class = $ loader ->load (function (Compiler $ compiler ): void {
87+ $ compiler ->addExtension ('console ' , new ConsoleExtension (false ));
88+ }, [getmypid (), 4 ]);
89+
90+ /** @var Container $container */
91+ $ container = new $ class ();
92+
93+ Assert::exception (static function () use ($ container ): void {
94+ $ container ->getByType (Application::class);
95+ }, MissingServiceException::class);
96+ });
97+
98+ // Config
99+ test (function (): void {
100+ $ loader = new ContainerLoader (TEMP_DIR , true );
101+ $ class = $ loader ->load (function (Compiler $ compiler ): void {
102+ $ compiler ->addExtension ('console ' , new ConsoleExtension (true ));
103+ $ compiler ->loadConfig (FileMock::create ('
104+ console:
105+ name: Hello world
106+ version: 1.0.0
107+ catchExceptions: false
108+ autoExit: false
109+ ' , 'neon ' ));
110+ }, [getmypid (), 5 ]);
111+
112+ /** @var Container $container */
113+ $ container = new $ class ();
114+
115+ $ application = $ container ->getByType (Application::class);
116+ Assert::type (Application::class, $ application );
117+ Assert::same ('Hello world ' , $ application ->getName ());
118+ Assert::same ('1.0.0 ' , $ application ->getVersion ());
119+ Assert::false ($ application ->areExceptionsCaught ());
120+ Assert::false ($ application ->isAutoExitEnabled ());
121+ });
122+
123+ // Lazy commands
124+ test (function (): void {
125+ $ loader = new ContainerLoader (TEMP_DIR , true );
126+ $ class = $ loader ->load (function (Compiler $ compiler ): void {
127+ $ compiler ->addExtension ('console ' , new ConsoleExtension (true ));
128+ $ compiler ->loadConfig (FileMock::create ('
129+ console:
130+ lazy: true
131+ services:
132+ defaultName: Tests\Fixtures\FooCommand
133+ tagNameString:
134+ factory: Tests\Fixtures\FooCommand
135+ tags: [console.command: bar]
136+ tagNameArray:
137+ factory: Tests\Fixtures\FooCommand
138+ tags: [console.command: [name: baz]]
139+ ' , 'neon ' ));
140+ }, [getmypid (), 6 ]);
141+
142+ /** @var Container $container */
143+ $ container = new $ class ();
144+
145+ $ application = $ container ->getByType (Application::class);
146+ Assert::type (Application::class, $ application );
147+ Assert::false ($ container ->isCreated ('defaultName ' ));
148+ Assert::count (3 , $ container ->findByType (Command::class));
149+ Assert::true ($ application ->has ('app:foo ' ));
150+ Assert::true ($ application ->has ('bar ' ));
151+ Assert::true ($ application ->has ('baz ' ));
152+ });
153+
154+ // Invalid command
155+ test (function (): void {
156+ Assert::exception (function (): void {
157+ $ loader = new ContainerLoader (TEMP_DIR , true );
158+ $ loader ->load (function (Compiler $ compiler ): void {
159+ $ compiler ->addExtension ('console ' , new ConsoleExtension (true ));
160+ $ compiler ->loadConfig (FileMock::create ('
161+ console:
162+ lazy: true
163+ services:
164+ noName: Tests\Fixtures\NoNameCommand
165+ ' , 'neon ' ));
166+ }, [getmypid (), 7 ]);
167+ }, ServiceCreationException::class, 'Command "Tests\Fixtures\NoNameCommand" missing tag "console.command[name]" or variable "$defaultName". ' );
168+ });
0 commit comments