Skip to content

Commit dfe5d49

Browse files
authored
test(dart_frog_cli): add e2e tests (#71)
1 parent 941ada1 commit dfe5d49

File tree

8 files changed

+168
-4
lines changed

8 files changed

+168
-4
lines changed

.github/workflows/dart_frog_cli.yaml

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ on:
44
pull_request:
55
paths:
66
- ".github/workflows/dart_frog_cli.yaml"
7+
- "packages/dart_frog_cli/e2e/**"
78
- "packages/dart_frog_cli/lib/**"
89
- "packages/dart_frog_cli/test/**"
910
- "packages/dart_frog_cli/pubspec.yaml"
@@ -12,6 +13,7 @@ on:
1213
- main
1314
paths:
1415
- ".github/workflows/dart_frog_cli.yaml"
16+
- "packages/dart_frog_cli/e2e/**"
1517
- "packages/dart_frog_cli/lib/**"
1618
- "packages/dart_frog_cli/test/**"
1719
- "packages/dart_frog_cli/pubspec.yaml"
@@ -22,6 +24,28 @@ jobs:
2224
with:
2325
working_directory: packages/dart_frog_cli
2426

27+
e2e:
28+
defaults:
29+
run:
30+
working-directory: packages/dart_frog_cli/e2e
31+
32+
runs-on: ubuntu-latest
33+
34+
steps:
35+
- name: 📚 Git Checkout
36+
uses: actions/checkout@v2
37+
38+
- name: 🎯 Setup Dart
39+
uses: dart-lang/setup-dart@v1
40+
41+
- name: 📦 Install Dependencies
42+
run: |
43+
dart pub global activate --source path ../
44+
dart pub get
45+
46+
- name: 🧪 Run E2E Tests
47+
run: dart test -j 1
48+
2549
pana:
2650
defaults:
2751
run:
@@ -30,12 +54,16 @@ jobs:
3054
runs-on: ubuntu-latest
3155

3256
steps:
33-
- uses: actions/[email protected]
34-
- uses: dart-lang/setup-dart@v1
57+
- name: 📚 Git Checkout
58+
uses: actions/checkout@v2
59+
60+
- name: 🎯 Setup Dart
61+
uses: dart-lang/setup-dart@v1
3562

36-
- name: Install Dependencies
63+
- name: 📦 Install Dependencies
3764
run: |
3865
dart pub get
3966
dart pub global activate pana
40-
- name: Verify Pub Score
67+
68+
- name: 📊 Verify Pub Score
4169
run: ../../tool/verify_pub_score.sh
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
name: dart_frog_cli_e2e
2+
description: End to End tests for package:dart_frog_cli
3+
publish_to: none
4+
5+
environment:
6+
sdk: ">=2.17.0 <3.0.0"
7+
8+
dev_dependencies:
9+
http: ^0.13.4
10+
meta: ^1.7.0
11+
path: ^1.8.2
12+
test: ^1.19.2
13+
very_good_analysis: ^3.0.0
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'dart:io';
2+
3+
import 'package:http/http.dart' as http;
4+
import 'package:path/path.dart' as path;
5+
import 'package:test/test.dart';
6+
7+
import 'helpers/helpers.dart';
8+
9+
/// Objectives:
10+
///
11+
/// * Generate a new Dart Frog project via `dart_frog create`
12+
/// * Run the dev server via `dart_frog dev`
13+
/// * Ensure the server responds accordingly for built-in endpoints
14+
void main() {
15+
group('Dev Server Smoke Test', () {
16+
const projectName = 'example';
17+
final tempDirectory = Directory.systemTemp.createTempSync();
18+
19+
setUpAll(() async {
20+
await dartFrogCreate(projectName: projectName, directory: tempDirectory);
21+
await dartFrogDev(
22+
directory: Directory(path.join(tempDirectory.path, projectName)),
23+
);
24+
});
25+
26+
tearDownAll(() async {
27+
await killDartFrogServer();
28+
await tempDirectory.delete(recursive: true);
29+
});
30+
31+
testServer('GET / returns 200 with greeting', (host) async {
32+
final response = await http.get(Uri.parse(host));
33+
expect(response.statusCode, equals(HttpStatus.ok));
34+
expect(response.body, equals('Welcome to Dart Frog!'));
35+
expect(response.headers, contains('date'));
36+
expect(
37+
response.headers,
38+
containsPair('content-type', 'text/plain; charset=utf-8'),
39+
);
40+
});
41+
42+
testServer('GET /not_here returns 404', (host) async {
43+
final response = await http.get(Uri.parse('$host/not_here'));
44+
expect(response.statusCode, HttpStatus.notFound);
45+
expect(response.body, 'Route not found');
46+
});
47+
});
48+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'dart:io';
2+
3+
Future<void> dartFrogCreate({
4+
required String projectName,
5+
required Directory directory,
6+
}) async {
7+
final result = await Process.run(
8+
'dart_frog',
9+
['create', projectName],
10+
workingDirectory: directory.path,
11+
);
12+
if (result.exitCode != 0) {
13+
throw Exception('dart_frog create exited with code $exitCode');
14+
}
15+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
import 'dart:io';
4+
5+
Future<void> dartFrogDev({required Directory directory}) async {
6+
final completer = Completer<void>();
7+
8+
final process = await Process.start(
9+
'dart_frog',
10+
['dev'],
11+
workingDirectory: directory.path,
12+
);
13+
14+
late StreamSubscription stdoutSubscription;
15+
late StreamSubscription stderrSubscription;
16+
17+
stdoutSubscription = process.stdout.listen((event) {
18+
final message = utf8.decode(event);
19+
if (message.contains('Hot reload is enabled.')) {
20+
stdoutSubscription.cancel();
21+
stderrSubscription.cancel();
22+
completer.complete();
23+
}
24+
});
25+
26+
stderrSubscription = process.stderr.listen((event) {
27+
final message = utf8.decode(event);
28+
stdoutSubscription.cancel();
29+
stderrSubscription.cancel();
30+
completer.completeError(message);
31+
exit(1);
32+
});
33+
34+
await completer.future;
35+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export 'dart_frog_create.dart';
2+
export 'dart_frog_dev.dart';
3+
export 'kill_dart_frog_server.dart';
4+
export 'test_server.dart';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'dart:io';
2+
3+
Future<void> killDartFrogServer() async {
4+
final result = await Process.run('pkill', ['-f', 'dart_frog']);
5+
if (result.exitCode != 0) {
6+
throw Exception('pkill -f dart_frog exited with code $exitCode');
7+
}
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'package:meta/meta.dart';
2+
import 'package:test/test.dart';
3+
4+
@isTest
5+
void testServer(String name, Future<void> Function(String host) func) {
6+
test(
7+
name,
8+
() async => func('http://localhost:8080'),
9+
timeout: _defaultTimeout,
10+
);
11+
}
12+
13+
const _defaultTimeout = Timeout(Duration(seconds: 3));

0 commit comments

Comments
 (0)