Skip to content

Commit 6f72d55

Browse files
author
serverpod_cloud
committed
test: 2bb5caeca04aae1f9b6b76871cb188a0f6039025
1 parent f851f1e commit 6f72d55

3 files changed

Lines changed: 72 additions & 62 deletions

File tree

serverpod_cloud_cli/test_integration/commands/auth/login_command_test.dart

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'dart:async';
22
import 'dart:io';
33

4-
import 'package:http/http.dart' as http;
54
import 'package:path/path.dart' as p;
65
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command_runner.dart';
76
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
@@ -12,6 +11,7 @@ import 'package:uuid/uuid.dart';
1211

1312
import '../../../test_utils/command_logger_matchers.dart';
1413
import '../../../test_utils/test_command_logger.dart';
14+
import '../../../test_utils/wait_for_callback_info.dart';
1515

1616
void main() {
1717
final logger = TestCommandLogger();
@@ -95,28 +95,13 @@ void main() {
9595
late Completer tokenSent;
9696
setUp(() async {
9797
tokenSent = Completer();
98-
final loggerFuture = logger.waitForLog();
98+
9999
unawaited(
100-
loggerFuture.then((final _) async {
101-
assert(logger.infoCalls.isNotEmpty, 'Expected log info messages.');
102-
final loggedMessage = logger.infoCalls.first.message;
103-
final splitMessage = loggedMessage.split('callback=');
104-
assert(
105-
splitMessage.length == 2,
106-
'Expected callback URL in log message.',
107-
);
108-
109-
final callbackUrl = Uri.parse(Uri.decodeFull(splitMessage[1]));
110-
final urlWithToken = callbackUrl.replace(
111-
queryParameters: {'token': testToken},
112-
);
113-
final response = await http.get(urlWithToken);
114-
assert(
115-
response.statusCode == 200,
116-
'Expected token response to have status code 200.',
117-
);
118-
tokenSent.complete();
119-
}),
100+
AuthCallbackHelper.completeAuthCallback(
101+
logger: logger,
102+
completer: tokenSent,
103+
token: testToken,
104+
),
120105
);
121106
});
122107

@@ -202,25 +187,12 @@ void main() {
202187
late Completer tokenSent;
203188
setUp(() async {
204189
tokenSent = Completer();
205-
final loggerFuture = logger.waitForLog();
190+
206191
unawaited(
207-
loggerFuture.then((final _) async {
208-
final loggedMessage = logger.infoCalls.first.message;
209-
final splitMessage = loggedMessage.split('callback=');
210-
assert(
211-
splitMessage.length == 2,
212-
'Expected callback URL in log message.',
213-
);
214-
215-
final callbackUrl = Uri.parse(Uri.decodeFull(splitMessage[1]));
216-
final response = await http.get(callbackUrl);
217-
assert(
218-
response.statusCode == 200,
219-
'Expected token response to have status code 200.',
220-
);
221-
222-
tokenSent.complete();
223-
}),
192+
AuthCallbackHelper.completeAuthCallback(
193+
logger: logger,
194+
completer: tokenSent,
195+
),
224196
);
225197
});
226198

serverpod_cloud_cli/test_integration/commands/cloud_cli_command_test.dart

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'dart:async';
55
import 'dart:io';
66

77
import 'package:config/config.dart';
8-
import 'package:http/http.dart' as http;
98
import 'package:path/path.dart' as p;
109
import 'package:test/test.dart';
1110
import 'package:uuid/uuid.dart';
@@ -17,6 +16,7 @@ import 'package:serverpod_cloud_cli/persistent_storage/models/serverpod_cloud_au
1716
import 'package:serverpod_cloud_cli/persistent_storage/resource_manager.dart';
1817

1918
import '../../test_utils/test_command_logger.dart';
19+
import '../../test_utils/wait_for_callback_info.dart';
2020

2121
class CommandThatRequiresLogin extends CloudCliCommand {
2222
@override
@@ -95,28 +95,13 @@ void main() {
9595
const testToken = 'myTestToken';
9696
late Completer tokenSent;
9797
tokenSent = Completer();
98-
final loggerFuture = logger.waitForLog();
99-
unawaited(
100-
loggerFuture.then((final _) async {
101-
assert(logger.infoCalls.isNotEmpty, 'Expected log info messages.');
102-
final loggedMessage = logger.infoCalls.first.message;
103-
final splitMessage = loggedMessage.split('callback=');
104-
assert(
105-
splitMessage.length == 2,
106-
'Expected callback URL in log message.',
107-
);
10898

109-
final callbackUrl = Uri.parse(Uri.decodeFull(splitMessage[1]));
110-
final urlWithToken = callbackUrl.replace(
111-
queryParameters: {'token': testToken},
112-
);
113-
final response = await http.get(urlWithToken);
114-
assert(
115-
response.statusCode == 200,
116-
'Expected token response to have status code 200.',
117-
);
118-
tokenSent.complete();
119-
}),
99+
unawaited(
100+
AuthCallbackHelper.completeAuthCallback(
101+
logger: logger,
102+
completer: tokenSent,
103+
token: testToken,
104+
),
120105
);
121106

122107
final cliOnDone = runner.run([
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'dart:async';
2+
3+
import 'package:http/http.dart' as http;
4+
5+
import 'test_command_logger.dart';
6+
7+
abstract final class AuthCallbackHelper {
8+
static Future<void> completeAuthCallback({
9+
required final TestCommandLogger logger,
10+
required final Completer<void> completer,
11+
final String? token,
12+
final Duration timeout = const Duration(seconds: 25),
13+
}) async {
14+
try {
15+
final deadline = DateTime.now().add(timeout);
16+
17+
while (DateTime.now().isBefore(deadline)) {
18+
await logger.waitForLog();
19+
final callbackInfo = logger.infoCalls
20+
.where((final call) => call.message.contains('callback='))
21+
.firstOrNull;
22+
if (callbackInfo != null) {
23+
final loggedMessage = callbackInfo.message;
24+
final splitMessage = loggedMessage.split('callback=');
25+
if (splitMessage.length != 2) {
26+
throw StateError('Expected callback URL in log message.');
27+
}
28+
29+
final callbackUrl = Uri.parse(Uri.decodeFull(splitMessage[1]));
30+
final urlToCall = token != null
31+
? callbackUrl.replace(queryParameters: {'token': token})
32+
: callbackUrl;
33+
final response = await http.get(urlToCall);
34+
if (response.statusCode != 200) {
35+
throw StateError(
36+
'Expected token response to have status code 200.',
37+
);
38+
}
39+
completer.complete();
40+
return;
41+
}
42+
}
43+
throw TimeoutException(
44+
'Timeout waiting for callback info log message',
45+
timeout,
46+
);
47+
} catch (e, st) {
48+
if (!completer.isCompleted) {
49+
completer.completeError(e, st);
50+
}
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)