feat(shorebird_cli): add logout command (#25)

This commit is contained in:
Felix Angelov
2023-03-06 16:12:10 -06:00
committed by GitHub
parent 806b891059
commit 2bf8850fd5
4 changed files with 93 additions and 0 deletions
@@ -51,6 +51,7 @@ class ShorebirdCliCommandRunner extends CompletionCommandRunner<int> {
codePushApiClientBuilder ?? ShorebirdCodePushApiClient.new;
addCommand(LoginCommand(auth: authentication, logger: _logger));
addCommand(LogoutCommand(auth: authentication, logger: _logger));
addCommand(
PublishCommand(
auth: authentication,
@@ -1,3 +1,4 @@
export 'login_command.dart';
export 'logout_command.dart';
export 'publish_command.dart';
export 'update_command.dart';
@@ -0,0 +1,39 @@
import 'package:args/command_runner.dart';
import 'package:mason_logger/mason_logger.dart';
import 'package:shorebird_cli/src/auth/auth.dart';
/// {@template logout_command}
///
/// `shorebird logout`
/// Logout of the current Shorebird user.
/// {@endtemplate}
class LogoutCommand extends Command<int> {
/// {@macro logout_command}
LogoutCommand({required Auth auth, required Logger logger})
: _auth = auth,
_logger = logger;
@override
String get description => 'Logout of the current Shorebird user';
@override
String get name => 'logout';
final Auth _auth;
final Logger _logger;
@override
Future<int> run() async {
final session = _auth.currentSession;
if (session == null) {
_logger.info('You are already logged out.');
return ExitCode.success.code;
}
final logoutProgress = _logger.progress('Logging out of shorebird.dev');
_auth.logout();
logoutProgress.complete();
return ExitCode.success.code;
}
}
@@ -0,0 +1,52 @@
import 'package:mason_logger/mason_logger.dart';
import 'package:mocktail/mocktail.dart';
import 'package:shorebird_cli/src/auth/auth.dart';
import 'package:shorebird_cli/src/auth/session.dart';
import 'package:shorebird_cli/src/commands/logout_command.dart';
import 'package:test/test.dart';
class _MockLogger extends Mock implements Logger {}
class _MockAuth extends Mock implements Auth {}
class _MockProgress extends Mock implements Progress {}
void main() {
group('LogoutCommand', () {
late Logger logger;
late Auth auth;
late LogoutCommand logoutCommand;
setUp(() {
logger = _MockLogger();
auth = _MockAuth();
logoutCommand = LogoutCommand(auth: auth, logger: logger);
when(() => logger.progress(any())).thenReturn(_MockProgress());
});
test('exits with code 0 when already logged out', () async {
final result = await logoutCommand.run();
expect(result, equals(ExitCode.success.code));
verify(
() => logger.info('You are already logged out.'),
).called(1);
});
test('exits with code 0 when logged out successfully', () async {
const session = Session(apiKey: 'test-api-key', projectId: 'example');
when(() => auth.currentSession).thenReturn(session);
final progress = _MockProgress();
when(() => progress.complete(any())).thenAnswer((invocation) {});
when(() => logger.progress(any())).thenReturn(progress);
final result = await logoutCommand.run();
expect(result, equals(ExitCode.success.code));
verify(() => logger.progress('Logging out of shorebird.dev')).called(1);
verify(() => auth.logout()).called(1);
});
});
}