@Override public AdminCommand.Provider findProvider( String name ) { AdminCommand.Provider provider = command.get(); return Objects.equals( name, provider.name() ) ? provider : commands.findProvider( name ); }
@Override public void execute( String... args ) throws IncorrectUsage { if ( args.length > 0 ) { try { AdminCommand.Provider commandProvider = this.locator.findProvider( args[0] ); usage.printUsageForCommand( commandProvider, output ); } catch ( NoSuchElementException e ) { StringBuilder validCommands = new StringBuilder(); locator.getAllProviders() .forEach( commandProvider -> validCommands.append( commandProvider.name() ).append( " " ) ); throw new IncorrectUsage( format( "Unknown command: %s. Available commands are: %s\n", args[0], validCommands ) ); } } else { usage.print( output ); } } }
@Test void printsUnknownCommandWhenUnknownCommandIsProvided() { CommandLocator commandLocator = mock( CommandLocator.class ); when( commandLocator.getAllProviders() ).thenReturn( Collections.emptyList() ); when( commandLocator.findProvider( "foobar" ) ).thenThrow( new NoSuchElementException( "foobar" ) ); HelpCommand helpCommand = new HelpCommand( mock( Usage.class ), out, commandLocator ); IncorrectUsage incorrectUsage = assertThrows( IncorrectUsage.class, () -> helpCommand.execute( "foobar" ) ); assertThat( incorrectUsage.getMessage(), containsString( "Unknown command: foobar" ) ); }
@Test void printsAvailableCommandsWhenUnknownCommandIsProvided() { CommandLocator commandLocator = mock( CommandLocator.class ); List<AdminCommand.Provider> mockCommands = asList( mockCommand( "foo" ), mockCommand( "bar" ), mockCommand( "baz" ) ); when( commandLocator.getAllProviders() ).thenReturn( mockCommands ); when( commandLocator.findProvider( "foobar" ) ).thenThrow( new NoSuchElementException( "foobar" ) ); HelpCommand helpCommand = new HelpCommand( mock( Usage.class ), out, commandLocator ); IncorrectUsage incorrectUsage = assertThrows( IncorrectUsage.class, () -> helpCommand.execute( "foobar" ) ); assertThat( incorrectUsage.getMessage(), containsString( "Available commands are: foo bar baz" ) ); }
when( commandProvider.possibleArguments() ).thenReturn( Collections.singletonList( arguments ) ); when( commandProvider.description() ).thenReturn( "This is a description of the foobar command." ); when( commandLocator.findProvider( "foobar" ) ).thenReturn( commandProvider );
try provider = commandLocator.findProvider( name ); for ( AdminCommand.Blocker blocker : blockerLocator.findBlockers( name ) )