| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:android_intent/flag.dart'; |
| import 'package:flutter/services.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:android_intent/android_intent.dart'; |
| import 'package:mockito/annotations.dart'; |
| import 'package:mockito/mockito.dart'; |
| import 'package:platform/platform.dart'; |
| |
| import 'android_intent_test.mocks.dart'; |
| |
| @GenerateMocks([MethodChannel]) |
| void main() { |
| late AndroidIntent androidIntent; |
| late MockMethodChannel mockChannel; |
| |
| setUp(() { |
| mockChannel = MockMethodChannel(); |
| when(mockChannel.invokeMethod<bool>('canResolveActivity', any)) |
| .thenAnswer((realInvocation) async => true); |
| when(mockChannel.invokeMethod<void>('launch', any)) |
| .thenAnswer((realInvocation) async => {}); |
| }); |
| |
| group('AndroidIntent', () { |
| test('raises error if neither an action nor a component is provided', () { |
| try { |
| androidIntent = AndroidIntent(data: 'https://flutter.io'); |
| fail('should raise an AssertionError'); |
| } on AssertionError catch (e) { |
| expect(e.message, 'action or component (or both) must be specified'); |
| } catch (e) { |
| fail('should raise an AssertionError'); |
| } |
| }); |
| |
| group('launch', () { |
| test('pass right params', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| data: Uri.encodeFull('https://flutter.io'), |
| flags: <int>[Flag.FLAG_ACTIVITY_NEW_TASK], |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| type: 'video/*'); |
| await androidIntent.launch(); |
| verify(mockChannel.invokeMethod<void>('launch', <String, Object>{ |
| 'action': 'action_view', |
| 'data': Uri.encodeFull('https://flutter.io'), |
| 'flags': |
| androidIntent.convertFlags(<int>[Flag.FLAG_ACTIVITY_NEW_TASK]), |
| 'type': 'video/*', |
| })); |
| }); |
| |
| test('can send Intent with an action and no component', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| ); |
| await androidIntent.launch(); |
| verify(mockChannel.invokeMethod<void>('launch', <String, Object>{ |
| 'action': 'action_view', |
| })); |
| }); |
| |
| test('can send Intent with a component and no action', () async { |
| androidIntent = AndroidIntent.private( |
| package: 'packageName', |
| componentName: 'componentName', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| ); |
| await androidIntent.launch(); |
| verify(mockChannel.invokeMethod<void>('launch', <String, Object>{ |
| 'package': 'packageName', |
| 'componentName': 'componentName', |
| })); |
| }); |
| |
| test('call in ios platform', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'ios')); |
| await androidIntent.launch(); |
| verifyZeroInteractions(mockChannel); |
| }); |
| }); |
| |
| group('canResolveActivity', () { |
| test('pass right params', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| data: Uri.encodeFull('https://flutter.io'), |
| flags: <int>[Flag.FLAG_ACTIVITY_NEW_TASK], |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| type: 'video/*'); |
| await androidIntent.canResolveActivity(); |
| verify(mockChannel |
| .invokeMethod<void>('canResolveActivity', <String, Object>{ |
| 'action': 'action_view', |
| 'data': Uri.encodeFull('https://flutter.io'), |
| 'flags': |
| androidIntent.convertFlags(<int>[Flag.FLAG_ACTIVITY_NEW_TASK]), |
| 'type': 'video/*', |
| })); |
| }); |
| |
| test('can send Intent with an action and no component', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| ); |
| await androidIntent.canResolveActivity(); |
| verify(mockChannel |
| .invokeMethod<void>('canResolveActivity', <String, Object>{ |
| 'action': 'action_view', |
| })); |
| }); |
| |
| test('can send Intent with a component and no action', () async { |
| androidIntent = AndroidIntent.private( |
| package: 'packageName', |
| componentName: 'componentName', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'android'), |
| ); |
| await androidIntent.canResolveActivity(); |
| verify(mockChannel |
| .invokeMethod<void>('canResolveActivity', <String, Object>{ |
| 'package': 'packageName', |
| 'componentName': 'componentName', |
| })); |
| }); |
| |
| test('call in ios platform', () async { |
| androidIntent = AndroidIntent.private( |
| action: 'action_view', |
| channel: mockChannel, |
| platform: FakePlatform(operatingSystem: 'ios')); |
| await androidIntent.canResolveActivity(); |
| verifyZeroInteractions(mockChannel); |
| }); |
| }); |
| }); |
| |
| group('convertFlags ', () { |
| androidIntent = const AndroidIntent( |
| action: 'action_view', |
| ); |
| test('add filled flag list', () async { |
| final List<int> flags = <int>[]; |
| flags.add(Flag.FLAG_ACTIVITY_NEW_TASK); |
| flags.add(Flag.FLAG_ACTIVITY_NEW_DOCUMENT); |
| expect( |
| androidIntent.convertFlags(flags), |
| 268959744, |
| ); |
| }); |
| test('add flags whose values are not power of 2', () async { |
| final List<int> flags = <int>[]; |
| flags.add(100); |
| flags.add(10); |
| expect( |
| () => androidIntent.convertFlags(flags), |
| throwsArgumentError, |
| ); |
| }); |
| test('add empty flag list', () async { |
| final List<int> flags = <int>[]; |
| expect( |
| androidIntent.convertFlags(flags), |
| 0, |
| ); |
| }); |
| }); |
| } |