From 574a992f092878dec9519410adc6e5122054c32e Mon Sep 17 00:00:00 2001 From: Mariana Ristovska Date: Wed, 7 May 2025 10:02:44 +0200 Subject: [PATCH 1/4] Setup pipeline --- .github/workflows/flutter_pipeline.yml | 101 +++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 .github/workflows/flutter_pipeline.yml diff --git a/.github/workflows/flutter_pipeline.yml b/.github/workflows/flutter_pipeline.yml new file mode 100644 index 0000000..37b34ca --- /dev/null +++ b/.github/workflows/flutter_pipeline.yml @@ -0,0 +1,101 @@ +name: Flutter CI/CD + +on: + pull_request: + branches: [ main ] + push: + branches: [ main ] + +jobs: + analyze: + name: Dart Analyze + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - uses: actions/checkout@v3 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.27.4' + + - name: Install dependencies + run: flutter pub get + + - name: Run analyzer + run: flutter analyze + + test: + name: Run Tests + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - uses: actions/checkout@v3 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.27.4' + + - name: Install dependencies + run: flutter pub get + + - name: Run tests + run: flutter test + + build-android: + name: Build Android APK + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + steps: + - uses: actions/checkout@v3 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.27.4' + + - name: Install dependencies + run: flutter pub get + + - name: Build APK + run: flutter build apk --release + + - name: Upload APK + uses: actions/upload-artifact@v4 + with: + name: app-release-apk + path: build/app/outputs/flutter-apk/app-release.apk + + build-ios: + name: Build iOS App + runs-on: macos-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + + steps: + - uses: actions/checkout@v3 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.27.4' + + - name: Install dependencies + run: flutter pub get + + - name: Build iOS + run: flutter build ios --release --no-codesign + + - name: Zip .app for download + run: | + mkdir -p ios-artifact + zip -r ios-artifact/Runner.app.zip build/ios/iphoneos/Runner.app + + - name: Upload iOS App + uses: actions/upload-artifact@v4 + with: + name: ios-app + path: ios-artifact/Runner.app.zip From 5c3b4d404a5bfa812d9e3e73b80305869e66f9ff Mon Sep 17 00:00:00 2001 From: Mariana Ristovska Date: Wed, 7 May 2025 10:19:54 +0200 Subject: [PATCH 2/4] Ignore warnings - should not be done in real project --- lib/features/landing/presentation/view/landing_page.dart | 1 + test/core/data/firebase_generic_datasource_test.dart | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/features/landing/presentation/view/landing_page.dart b/lib/features/landing/presentation/view/landing_page.dart index 5473dad..c67dd57 100644 --- a/lib/features/landing/presentation/view/landing_page.dart +++ b/lib/features/landing/presentation/view/landing_page.dart @@ -34,6 +34,7 @@ class _LandingPageState extends State with SingleTickerProviderStat }); Future.delayed(const Duration(seconds: 3), () { + //ignore: use_build_context_synchronously context.go('/home', extra: 'landing'); }); } diff --git a/test/core/data/firebase_generic_datasource_test.dart b/test/core/data/firebase_generic_datasource_test.dart index 5c15019..0e0d665 100644 --- a/test/core/data/firebase_generic_datasource_test.dart +++ b/test/core/data/firebase_generic_datasource_test.dart @@ -3,7 +3,8 @@ import 'package:devcon_hub/core/data/firebase_datasource.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -// --- Mock Classes --- +// ignore_for_file: subtype_of_sealed_class + class MockFirebaseFirestore extends Mock implements FirebaseFirestore {} class MockCollectionReference extends Mock implements CollectionReference> {} From 95e48d45a499136738c47974de39307bc6dbe956 Mon Sep 17 00:00:00 2001 From: Mariana Ristovska Date: Wed, 7 May 2025 10:25:37 +0200 Subject: [PATCH 3/4] Remove generated widget test --- test/widget_test.dart | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 test/widget_test.dart diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 73a5f01..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,29 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:devcon_hub/app/app.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} From 48e64c7a6a44b2f8f6a5051bb4147c853eabcac7 Mon Sep 17 00:00:00 2001 From: Mariana Ristovska Date: Wed, 7 May 2025 10:26:06 +0200 Subject: [PATCH 4/4] Stub cubit.close() behavior in tests --- test/features/agenda/presentation/agenda_page_test.dart | 1 + test/features/resources/presentation/resources_page_test.dart | 1 + test/features/speakers/presentation/speakers_page_test.dart | 1 + 3 files changed, 3 insertions(+) diff --git a/test/features/agenda/presentation/agenda_page_test.dart b/test/features/agenda/presentation/agenda_page_test.dart index b0077a2..e87bd4e 100644 --- a/test/features/agenda/presentation/agenda_page_test.dart +++ b/test/features/agenda/presentation/agenda_page_test.dart @@ -47,6 +47,7 @@ void main() { when(() => mockUseCase.call(null)).thenAnswer((_) async => agendaItems); when(() => mockCubit.execute()).thenAnswer((_) async {}); + when(() => mockCubit.close()).thenAnswer((_) async {}); }); tearDownAll(() { diff --git a/test/features/resources/presentation/resources_page_test.dart b/test/features/resources/presentation/resources_page_test.dart index 5c95b8c..1a1477f 100644 --- a/test/features/resources/presentation/resources_page_test.dart +++ b/test/features/resources/presentation/resources_page_test.dart @@ -30,6 +30,7 @@ void main() { when(() => mockUseCase.call(null)).thenAnswer((_) async => resources); when(() => mockCubit.execute()).thenAnswer((_) async {}); + when(() => mockCubit.close()).thenAnswer((_) async {}); }); tearDownAll(() { diff --git a/test/features/speakers/presentation/speakers_page_test.dart b/test/features/speakers/presentation/speakers_page_test.dart index d62e7e5..6258dae 100644 --- a/test/features/speakers/presentation/speakers_page_test.dart +++ b/test/features/speakers/presentation/speakers_page_test.dart @@ -45,6 +45,7 @@ void main() { when(() => mockUseCase.call(null)).thenAnswer((_) async => speakers); when(() => mockCubit.execute()).thenAnswer((_) async {}); + when(() => mockCubit.close()).thenAnswer((_) async {}); }); tearDownAll(() {