Skip to content

Commit e114ca2

Browse files
authored
Merge pull request #12 from gogovan/test/enhance
Update tests, add "build" build
2 parents a57a48b + f5cff12 commit e114ca2

File tree

10 files changed

+50
-27
lines changed

10 files changed

+50
-27
lines changed

.github/workflows/build.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
build:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v3
13+
- uses: subosito/flutter-action@v2
14+
with:
15+
channel: 'stable'
16+
17+
- name: Install dependencies
18+
run: |
19+
flutter pub get
20+
flutter pub run build_runner build
21+
22+
- name: Run tests
23+
run: flutter test
24+

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# flutter-force-permission
22

3-
[![codecov](https://codecov.io/gh/gogovan/flutter-force-permission/branch/main/graph/badge.svg?token=F9DPJUAVAJ)](https://codecov.io/gh/gogovan/flutter-force-permission)
3+
![Build](https://github.com/github/gogovan/flutter-force-permission/workflows/build.yaml/badge.svg)
4+
![codecov](https://codecov.io/gh/gogovan/flutter-force-permission/branch/main/graph/badge.svg?token=F9DPJUAVAJ)](https://codecov.io/gh/gogovan/flutter-force-permission)
45

56
Show permission disclosure page and allows required permissions and their associated services before
67
the user can proceed.

analysis_options.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ dart_code_metrics:
183183
- lib/main.dart
184184
rules:
185185
# Common
186-
- avoid-banned-imports # Configure some imports that you want to ban, ref: https://dartcodemetrics.dev/docs/rules/common/avoid-banned-imports
186+
# - avoid-banned-imports # Configure some imports that you want to ban, ref: https://dartcodemetrics.dev/docs/rules/common/avoid-banned-imports
187187
- avoid-collection-methods-with-unrelated-types # Avoid using collection methods with unrelated types, such as accessing a map of integers using a string key.
188188
- avoid-duplicate-exports # Warns when a file has multiple exports declarations with the same URI.
189189
# - avoid-dynamic # Warns when the dynamic type is used as a variable type in a declaration, return type of a function, etc. Using dynamic is considered unsafe since it can easily result in runtime errors.
@@ -203,7 +203,7 @@ dart_code_metrics:
203203
- avoid-unused-parameters: # Checks for unused parameters inside a function or method body. For overridden methods suggests renaming unused parameters to _, __, etc.
204204
exclude:
205205
- lib/**/*bloc.dart
206-
- ban-name # Configure some names that you want to ban, ref: https://dartcodemetrics.dev/docs/rules/common/ban-name
206+
# - ban-name # Configure some names that you want to ban, ref: https://dartcodemetrics.dev/docs/rules/common/ban-name
207207
- binary-expression-operand-order # Warns when a literal value is on the left hand side in a binary expressions, inspired by https://palantir.github.io/tslint/rules/binary-expression-operand-order/
208208
- double-literal-format # Checks that double literals should begin with 0. instead of just ., and should not end with a trailing 0. Helps keep a consistent style of numeric literals and decrease potential typos.
209209
- format-comment # Prefer format comments like sentences.

lib/flutter_force_permission.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
44
import 'package:flutter_force_permission/flutter_force_permission_config.dart';
55
import 'package:flutter_force_permission/permission_service_status.dart';
66
import 'package:flutter_force_permission/src/flutter_force_permission_util.dart';
7-
import 'package:flutter_force_permission/src/permission_service.dart';
7+
import 'package:flutter_force_permission/src/test_stub.dart';
88
import 'package:flutter_force_permission/src/views/disclosure_page.dart';
99
import 'package:permission_handler/permission_handler.dart';
1010

lib/permission_item_config.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@ class PermissionItemConfig {
2121
/// The display item configuration for these permission(s). Refer to [PermissionItemText] for details.
2222
final PermissionItemText itemText;
2323

24-
/// If the permission has an associated service (e.g. location) and this permission is required,
25-
/// this service will also be checked for availability.
26-
/// If service is unavailable and this item is not null, the disclosure page will
27-
/// show a disclosure item for this service, before `itemText`.
24+
/// If the permission has an associated service (such as location) and this permission is required, this service will also be checked for availability.
25+
/// If service is unavailable and this item is not null, the disclosure page will show a disclosure item for this service, before `itemText`.
2826
/// Users will also be asked to enable the service.
2927
///
3028
/// *Note*: This is used only when `required` is true.

lib/src/permission_service.dart renamed to lib/src/test_stub.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import 'package:app_settings/app_settings.dart';
22
import 'package:permission_handler/permission_handler.dart';
33
import 'package:shared_preferences/shared_preferences.dart';
44

5-
/// 3rd party libraries relies too many on static methods which are unmockable
6-
/// and hence untestable. This service wraps permission_handler methods
7-
/// so that it can be tested.
8-
/// https://github.com/Baseflow/flutter-permission-handler/issues/262
5+
/// 3rd party libraries relies on static methods which are unmockable and hence untestable.
6+
/// This service wraps those methods so that it can be tested.
7+
/// See https://github.com/Baseflow/flutter-permission-handler/issues/262 for details.
98
class TestStub {
109
const TestStub();
1110

lib/src/views/disclosure_page.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter_force_permission/permission_item_config.dart';
77
import 'package:flutter_force_permission/permission_item_text.dart';
88
import 'package:flutter_force_permission/permission_service_status.dart';
99
import 'package:flutter_force_permission/src/flutter_force_permission_util.dart';
10-
import 'package:flutter_force_permission/src/permission_service.dart';
10+
import 'package:flutter_force_permission/src/test_stub.dart';
1111
import 'package:permission_handler/permission_handler.dart';
1212

1313
/// Disclosure page.
@@ -316,7 +316,6 @@ class _DisclosurePageState extends State<DisclosurePage>
316316
}
317317

318318
Future<void> _showPhoneSettings() async {
319-
// TODO(peter): find function to open phone settings directly if possible.
320319
await widget._service.openAppSettings();
321320
}
322321

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ dev_dependencies:
2121
flutter_test:
2222
sdk: flutter
2323
flutter_lints: ^2.0.0
24-
dart_code_metrics: ^5.0.1
24+
dart_code_metrics: ^5.4.0
2525
mockito: ^5.3.2
2626
build_runner: ^2.3.2

test/unit_test/flutter_force_permission_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'package:flutter_force_permission/flutter_force_permission.dart';
44
import 'package:flutter_force_permission/flutter_force_permission_config.dart';
55
import 'package:flutter_force_permission/permission_item_config.dart';
66
import 'package:flutter_force_permission/permission_item_text.dart';
7-
import 'package:flutter_force_permission/src/permission_service.dart';
7+
import 'package:flutter_force_permission/src/test_stub.dart';
88
import 'package:flutter_test/flutter_test.dart';
99
import 'package:mockito/annotations.dart';
1010
import 'package:mockito/mockito.dart';

test/widget_test/disclosure_page_test.dart

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter_force_permission/forced_permission_dialog_config.dart';
77
import 'package:flutter_force_permission/permission_item_config.dart';
88
import 'package:flutter_force_permission/permission_item_text.dart';
99
import 'package:flutter_force_permission/permission_service_status.dart';
10-
import 'package:flutter_force_permission/src/permission_service.dart';
10+
import 'package:flutter_force_permission/src/test_stub.dart';
1111
import 'package:flutter_force_permission/src/views/disclosure_page.dart';
1212
import 'package:flutter_test/flutter_test.dart';
1313
import 'package:mockito/annotations.dart';
@@ -23,14 +23,16 @@ void main() {
2323
when(prefs.getBool('Permission.location_requested')).thenReturn(false);
2424
when(prefs.setBool('Permission.location_requested', any))
2525
.thenAnswer((realInvocation) => Future.value(true));
26+
when(prefs.setBool('Permission.phone_requested', any))
27+
.thenAnswer((realInvocation) => Future.value(true));
2628

2729
testWidgets('Regular permission show dialog', (tester) async {
2830
final testStub = MockTestStub();
2931
when(testStub.getSharedPreference())
3032
.thenAnswer((realInvocation) => Future.value(prefs));
31-
when(testStub.request(Permission.location))
33+
when(testStub.request(Permission.phone))
3234
.thenAnswer((realInvocation) => Future.value(PermissionStatus.granted));
33-
when(testStub.status(Permission.location))
35+
when(testStub.status(Permission.phone))
3436
.thenAnswer((realInvocation) => Future.value(PermissionStatus.granted));
3537

3638
final config = FlutterForcePermissionConfig(
@@ -39,7 +41,7 @@ void main() {
3941
permissionItemConfigs: [
4042
PermissionItemConfig(
4143
permissions: [
42-
Permission.location,
44+
Permission.phone,
4345
],
4446
itemText: PermissionItemText(
4547
header: 'Foreground location',
@@ -49,7 +51,7 @@ void main() {
4951
],
5052
);
5153
final status = <Permission, PermissionServiceStatus>{
52-
Permission.location: PermissionServiceStatus(
54+
Permission.phone: PermissionServiceStatus(
5355
status: PermissionStatus.denied,
5456
requested: false,
5557
serviceStatus: ServiceStatus.enabled,
@@ -76,7 +78,8 @@ void main() {
7678
await tester.tap(find.text('Confirm'));
7779
await tester.pump();
7880

79-
verify(prefs.setBool('Permission.location_requested', true));
81+
verify(testStub.request(Permission.phone));
82+
verify(prefs.setBool('Permission.phone_requested', true));
8083

8184
await resumed.close();
8285
});
@@ -139,6 +142,7 @@ void main() {
139142
await tester.tap(find.text('Confirm'));
140143
await tester.pump();
141144

145+
verify(testStub.request(Permission.location));
142146
verify(prefs.setBool('Permission.location_requested', true));
143147

144148
await resumed.close();
@@ -205,6 +209,8 @@ void main() {
205209
await tester.tap(find.text('Confirm'));
206210
await tester.pump();
207211

212+
verify(testStub.request(Permission.location));
213+
208214
expect(find.text('Location required'), findsOneWidget);
209215
expect(find.text('Location needed for proper operation'), findsOneWidget);
210216
expect(find.text('Settings'), findsOneWidget);
@@ -481,11 +487,7 @@ void main() {
481487
await tester.tap(find.text('Confirm'));
482488
await tester.pump();
483489

484-
verify(testStub.openAppSettings());
485-
486-
resumed.add(true);
487-
await tester.pump();
488-
490+
verify(testStub.request(Permission.location));
489491
when(testStub.status(Permission.location)).thenAnswer(
490492
(realInvocation) => Future.value(PermissionStatus.granted),
491493
);

0 commit comments

Comments
 (0)