Skip to content

Commit 610ebf2

Browse files
authored
ci: separate integration tests (flutter-stripe#1059)
* ci: separate integration tests * fix: cache dependencies * fix: timeout test
1 parent 80d0442 commit 610ebf2

File tree

5 files changed

+5253
-5293
lines changed

5 files changed

+5253
-5293
lines changed

.github/workflows/all_plugins.yaml

+72-22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: all_plugins
1+
name: packages (all)
22

33
on:
44
push:
@@ -72,22 +72,82 @@ jobs:
7272
- name: "Run unittest"
7373
run: melos run unittest
7474

75+
ios_integration_test:
76+
name: integration test (iOS)
77+
needs: [analyze, test]
78+
timeout-minutes: 60
79+
runs-on: macos-latest
80+
steps:
81+
- uses: actions/checkout@v2
82+
- uses: subosito/flutter-action@v2
83+
with:
84+
cache: true
85+
- uses: actions/setup-node@v3
86+
with:
87+
node-version: 16
88+
cache: 'yarn'
89+
cache-dependency-path: example/server/yarn.lock
90+
- name: Cache pods
91+
uses: actions/cache@v2
92+
with:
93+
path: example/iOS/Pods
94+
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
95+
restore-keys: |
96+
${{ runner.os }}-pods-
97+
- name: "Install Tools"
98+
run: |
99+
./.github/workflows/scripts/install-tools.sh
100+
101+
- name: "Bootstrap Workspace"
102+
run: melos bootstrap
103+
104+
- name: "Set env keys"
105+
env:
106+
STRIPE_PUBLISHABLE_KEY: ${{ secrets.STRIPE_PUBLISHABLE_KEY }}
107+
STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }}
108+
run: |
109+
./.github/workflows/scripts/env-files.sh
110+
111+
- name: "Start dev server"
112+
working-directory: example/server
113+
run: yarn install && (yarn start:dev &)
114+
115+
- name: "Set IP address"
116+
working-directory: example
117+
run: |
118+
echo "const kApiUrl='''$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}')''';" > integration_test/ip.dart
119+
cat integration_test/ip.dart
120+
121+
- name: "Start iOS Simulator"
122+
run: |
123+
xcrun simctl boot "iPhone 13 mini"
124+
125+
- name: "Run Flutter Driver tests on iOS"
126+
working-directory: example
127+
run: "flutter drive --driver test_driver/integration_test.dart --target=integration_test/run_all_tests.dart"
75128

76-
integration_test:
77-
name: Integration test
129+
android_integration_test:
130+
name: integration test (Android)
131+
needs: [analyze, test, ios_integration_test]
78132
timeout-minutes: 60
79133
runs-on: macos-latest
80134
steps:
81135
- uses: actions/checkout@v2
136+
- uses: subosito/flutter-action@v2
137+
with:
138+
cache: true
139+
- uses: actions/setup-node@v3
140+
with:
141+
node-version: 16
142+
cache: 'yarn'
143+
cache-dependency-path: example/server/yarn.lock
82144

83145
- name: Set up Java version
84146
uses: actions/setup-java@v1
85147
with:
86148
java-version: '11'
87-
88-
- uses: subosito/flutter-action@v2
89-
with:
90-
channel: 'stable'
149+
- name: Setup Gradle
150+
uses: gradle/gradle-build-action@v2
91151

92152
- name: "Install Tools"
93153
run: |
@@ -105,15 +165,13 @@ jobs:
105165
106166
- name: "Start dev server"
107167
working-directory: example/server
108-
run: npm install && (npm run start:dev &)
168+
run: yarn install && (yarn start:dev &)
109169

110170
- name: "Set IP address"
111171
working-directory: example
112-
run: echo "const kApiUrl='''$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}')''';" > integration_test/ip.dart
113-
114-
- name: "Print ip.dart"
115-
working-directory: example
116-
run: cat integration_test/ip.dart
172+
run: |
173+
echo "const kApiUrl='''$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}')''';" > integration_test/ip.dart
174+
cat integration_test/ip.dart
117175
118176
- name: "Run integration test Android"
119177
uses: reactivecircus/android-emulator-runner@v2
@@ -123,12 +181,4 @@ jobs:
123181
script: |
124182
sleep 15;
125183
flutter drive --driver test_driver/integration_test.dart --target=integration_test/run_all_tests.dart;
126-
cd android && ./gradlew :app:connectedDebugAndroidTest;
127-
128-
- name: "Start iOS Simulator"
129-
run: |
130-
xcrun simctl boot "iPhone 13 mini"
131-
132-
- name: "Run Flutter Driver tests on iOS"
133-
working-directory: example
134-
run: "flutter drive --driver test_driver/integration_test.dart --target=integration_test/run_all_tests.dart"
184+
cd android && ./gradlew :app:connectedDebugAndroidTest;

example/integration_test/app_test.dart

+15-13
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,25 @@ void main() {
2121
// 1. create payment intent on the server
2222
final _paymentSheetData = await _createTestPaymentSheet();
2323

24+
expect(_paymentSheetData['paymentIntent'], isNotNull);
2425
// 2. initialize the payment sheet
25-
await Stripe.instance.initPaymentSheet(
26-
paymentSheetParameters: SetupPaymentSheetParameters(
27-
applePay: PaymentSheetApplePay(merchantCountryCode: 'DE'),
28-
googlePay: PaymentSheetGooglePay(
29-
merchantCountryCode: 'DE',
30-
testEnv: true,
26+
expect(
27+
Stripe.instance.initPaymentSheet(
28+
paymentSheetParameters: SetupPaymentSheetParameters(
29+
applePay: PaymentSheetApplePay(merchantCountryCode: 'DE'),
30+
googlePay: PaymentSheetGooglePay(
31+
merchantCountryCode: 'DE',
32+
testEnv: true,
33+
),
34+
style: ThemeMode.dark,
35+
merchantDisplayName: 'Flutter Stripe Store Demo',
36+
customerId: _paymentSheetData['customer'],
37+
paymentIntentClientSecret: _paymentSheetData['paymentIntent'],
38+
customerEphemeralKeySecret: _paymentSheetData['ephemeralKey'],
3139
),
32-
style: ThemeMode.dark,
33-
merchantDisplayName: 'Flutter Stripe Store Demo',
34-
customerId: _paymentSheetData['customer'],
35-
paymentIntentClientSecret: _paymentSheetData['paymentIntent'],
36-
customerEphemeralKeySecret: _paymentSheetData['ephemeralKey'],
3740
),
41+
completes,
3842
);
39-
40-
expect(true, _paymentSheetData['paymentIntent'] != null);
4143
});
4244
});
4345

example/integration_test/payment_method_test.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import 'dart:convert';
22
import 'dart:io';
33

4+
import 'package:flutter/material.dart';
45
import 'package:flutter_stripe/flutter_stripe.dart';
56
import 'package:flutter_test/flutter_test.dart';
67
import 'package:http/http.dart' as http;
78
import 'package:integration_test/integration_test.dart';
9+
import 'package:stripe_example/screens/card_payments/webhook_payment_screen.dart';
810

911
import '.env.dart';
1012
import 'ip.dart';
@@ -31,14 +33,17 @@ void main() {
3133

3234
group('PaymentMethod', () {
3335
testWidgets('confirmPayment', (tester) async {
36+
await tester.pumpWidget(MaterialApp(home: WebhookPaymentScreen()));
37+
await tester.pumpAndSettle();
3438
final clientSecret = await fetchPaymentIntentClientSecret();
3539

3640
await Stripe.instance.dangerouslyUpdateCardDetails(CardDetails(
37-
number: '4242424242424242',
41+
number: '378282246310005', // Use a card does not support 3DS
3842
cvc: '424',
3943
expirationMonth: 04,
4044
expirationYear: 2025,
4145
));
46+
;
4247
final paymentIntent = await Stripe.instance.confirmPayment(
4348
paymentIntentClientSecret: clientSecret['clientSecret'],
4449
data: PaymentMethodParams.card(
@@ -50,7 +55,6 @@ void main() {
5055
setupFutureUsage: null,
5156
),
5257
);
53-
5458
expect(paymentIntent.id, startsWith('pi_'));
5559
});
5660

example/integration_test/run_all_tests.dart

+5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
import 'package:integration_test/integration_test.dart';
2+
import 'package:test/scaffolding.dart';
3+
14
import 'app_test.dart' as appTest;
25
import 'payment_method_test.dart' as paymentMethodTest;
36

47
void main() {
8+
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
9+
binding.defaultTestTimeout = Timeout(Duration(minutes: 1));
510
appTest.main();
611
paymentMethodTest.main();
712
// TODO test is flaky cardFieldTest.main();

0 commit comments

Comments
 (0)