Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

List projects from CLI with Google Cloud #380

Merged
merged 1 commit into from
Nov 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions takeoff/takeoff_cli/lib/input/commands/list_command.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:args/command_runner.dart';
import 'package:takeoff_cli/services/project_service.dart';

class ListCommand extends Command {
final ProjectsService service;
@override
final String name = "list";
@override
final String description =
"List all the projects created from TakeOff with the selected Cloud Provider";

ListCommand(this.service) {
argParser.addOption("cloud",
allowed: ["gc", "aws", "azure"], mandatory: true);
}

@override
void run() {
service.listProjects(argResults?["cloud"]);
}
}
32 changes: 22 additions & 10 deletions takeoff/takeoff_cli/lib/services/project_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,28 @@ class ProjectsService {
);

Future<void> initAccount(String cloud, String email) async {
switch (cloud) {
case "gc":
_takeOffFacade.initGoogleCloud(email);
break;
case "aws":
Log.warning("Not implemented yet");
break;
case "azure":
Log.warning("Not implemented yet");
break;
CloudProviderId cloudProvider = CloudProviderId.fromString(cloud);
await _takeOffFacade.init(email, cloudProvider);
}

Future<void> listProjects(String cloud) async {
CloudProviderId providerId = CloudProviderId.fromString(cloud);
CloudProvider provider = CloudProvider.fromId(providerId);

if ((await _takeOffFacade.getCurrentAccount(providerId)).isEmpty) {
Log.error("You have not logged in with ${provider.name}");
return;
}

List<String> projects = await _takeOffFacade.getProjects(providerId);

if (projects.isEmpty) {
Log.warning("No projects created with ${provider.name}");
return;
}
print("Projects from ${provider.name}:");
for (var element in projects) {
print(element);
}
}
}
2 changes: 2 additions & 0 deletions takeoff/takeoff_cli/lib/takeoff_cli.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:args/command_runner.dart';
import 'package:takeoff_cli/input/commands/init_command.dart';
import 'package:takeoff_cli/input/commands/list_command.dart';
import 'package:takeoff_cli/services/project_service.dart';
import 'package:takeoff_lib/takeoff_lib.dart';

Expand All @@ -11,6 +12,7 @@ class TakeOffCli {
ProjectsService projectsService = ProjectsService(facade);
CommandRunner("takeoff", "A CLI to easily create cloud environment.")
..addCommand(InitCommand(projectsService))
..addCommand(ListCommand(projectsService))
..run(args);
}
}
137 changes: 135 additions & 2 deletions takeoff/takeoff_cli/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,76 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
build:
dependency: transitive
description:
name: build
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.1"
build_config:
dependency: transitive
description:
name: build_config
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
build_daemon:
dependency: transitive
description:
name: build_daemon
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
build_runner:
dependency: "direct dev"
description:
name: build_runner
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.2"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.7"
built_collection:
dependency: transitive
description:
name: built_collection
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
url: "https://pub.dartlang.org"
source: hosted
version: "8.4.2"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.dartlang.org"
source: hosted
version: "4.3.0"
collection:
dependency: transitive
description:
Expand Down Expand Up @@ -64,13 +134,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
dart_style:
dependency: transitive
description:
name: dart_style
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.4"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
frontend_server_client:
dependency: transitive
description:
Expand All @@ -79,7 +163,7 @@ packages:
source: hosted
version: "3.1.0"
get_it:
dependency: transitive
dependency: "direct dev"
description:
name: get_it
url: "https://pub.dartlang.org"
Expand All @@ -92,6 +176,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
graphs:
dependency: transitive
description:
name: graphs
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
http_multi_server:
dependency: transitive
description:
Expand Down Expand Up @@ -120,6 +211,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.4"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "4.7.0"
lints:
dependency: "direct dev"
description:
Expand Down Expand Up @@ -162,6 +260,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
mockito:
dependency: "direct dev"
description:
name: mockito
url: "https://pub.dartlang.org"
source: hosted
version: "5.3.2"
node_preamble:
dependency: transitive
description:
Expand Down Expand Up @@ -197,8 +302,15 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
sembast:
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
sembast:
dependency: "direct dev"
description:
name: sembast
url: "https://pub.dartlang.org"
Expand Down Expand Up @@ -232,6 +344,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
source_gen:
dependency: transitive
description:
name: source_gen
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.6"
source_map_stack_trace:
dependency: transitive
description:
Expand Down Expand Up @@ -267,6 +386,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
Expand Down Expand Up @@ -316,6 +442,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.20"
timing:
dependency: transitive
description:
name: timing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
typed_data:
dependency: transitive
description:
Expand Down
6 changes: 5 additions & 1 deletion takeoff/takeoff_cli/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ dependencies:

dev_dependencies:
lints: ^2.0.0
test: ^1.16.0
test: ^1.16.0
get_it: ^7.2.0
mockito: ^5.3.2
build_runner: ^2.3.2
sembast: ^3.3.1
92 changes: 92 additions & 0 deletions takeoff/takeoff_cli/test/services/project_service_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import 'dart:async';
import 'dart:math';

import 'package:get_it/get_it.dart';
import 'package:sembast/sembast.dart';
import 'package:sembast/sembast_io.dart';
import 'package:takeoff_cli/services/project_service.dart';
import 'package:takeoff_lib/src/utils/platform/platform_service.dart';
import 'package:takeoff_lib/src/utils/folders/folders_service.dart';
import 'package:takeoff_lib/src/persistence/database/database_singleton.dart';
import 'package:takeoff_lib/src/persistence/cache_repository_impl.dart';
import 'package:takeoff_lib/src/controllers/persistence/cache_repository.dart';
import 'package:takeoff_lib/takeoff_lib.dart';
import 'package:test/test.dart';

List<String> log = [];

void main() {
late FoldersService foldersService;

setUpAll(() {
GetIt.I.registerSingleton(PlatformService());
foldersService = FoldersService();
GetIt.I.registerSingleton(foldersService);
});

setUp(() async {
log.clear();
GetIt.I.registerSingleton<Database>(
await DatabaseSingleton(dbPath: "project_service_test.db")
.initialize());
});

test(
"listProjects prints the correct message if not logged with Google Cloud",
overridePrint(() async {
ProjectsService projectsService = ProjectsService(TakeOffFacade());
await projectsService.listProjects("gc");

expect(log.length, 1);
expect(
log.first.contains("You have not logged in with Google Cloud"), true);
}));

test(
"listProjects prints the correct message if no projects are created with Google Cloud",
overridePrint(() async {
CacheRepository cacheRepository = CacheRepositoryImpl();
String email = "test${Random().nextInt(10000)}@mail.com}";
await cacheRepository.saveGoogleEmail(email);
ProjectsService projectsService = ProjectsService(TakeOffFacade());
await projectsService.listProjects("gc");

expect(log.length, 1);
expect(log.first.contains("No projects created with Google Cloud"), true);
}));

test(
"listProjects prints the correct messages if there are projects created with Google Cloud",
overridePrint(() async {
CacheRepository cacheRepository = CacheRepositoryImpl();
String email = "test${Random().nextInt(10000)}@mail.com}";
await cacheRepository.saveGoogleEmail(email);

List<String> projects =
List.generate(15, (_) => Random().nextInt(1000000).toString());
for (String elem in projects) {
await cacheRepository.saveGoogleProjectId(elem);
}

ProjectsService projectsService = ProjectsService(TakeOffFacade());

await projectsService.listProjects("gc");

expect(log.length, 16);
expect(log.first.contains("Projects from Google Cloud:"), true);
expect(log.sublist(1), projects);
}));

tearDown(() async {
GetIt.I.unregister<Database>();
await databaseFactoryIo.deleteDatabase("project_service_test.db");
});
}

void Function() overridePrint(void Function() testFn) => () {
var spec = ZoneSpecification(print: (_, __, ___, String msg) {
// Add to log instead of printing to stdout
log.add(msg);
});
return Zone.current.fork(specification: spec).run<void>(testFn);
};
Loading