Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 1295feb

Browse files
committed
use shortcut item parser instead of shortcut state manager
1 parent 0ed9db6 commit 1295feb

10 files changed

+165
-126
lines changed

packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
1919
E092A7ED28D10802005C7F67 /* MockMethodChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7EA28D10801005C7F67 /* MockMethodChannel.swift */; };
2020
E092A7EE28D10802005C7F67 /* QuickActionsPluginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7EB28D10802005C7F67 /* QuickActionsPluginTests.swift */; };
21-
E092A7EF28D10802005C7F67 /* MockShortcutStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7EC28D10802005C7F67 /* MockShortcutStateManager.swift */; };
22-
E092A7F128D10890005C7F67 /* MockShortcutItemService.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F028D10890005C7F67 /* MockShortcutItemService.swift */; };
23-
E092A7F428D110B3005C7F67 /* DefaultShortcutStateManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F328D110B3005C7F67 /* DefaultShortcutStateManagerTests.swift */; };
21+
E092A7F128D10890005C7F67 /* MockAppShortcutController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F028D10890005C7F67 /* MockAppShortcutController.swift */; };
22+
E092A7F428D110B3005C7F67 /* DefaultShortcutItemParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F328D110B3005C7F67 /* DefaultShortcutItemParserTests.swift */; };
2423
E092A7F628D128EB005C7F67 /* RunnerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F528D128EB005C7F67 /* RunnerUITests.swift */; };
24+
E0A075D529147FE200329BAE /* MockShortcutItemParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0A075D429147FE200329BAE /* MockShortcutItemParser.swift */; };
2525
/* End PBXBuildFile section */
2626

2727
/* Begin PBXContainerItemProxy section */
@@ -80,10 +80,10 @@
8080
C35AD3650AB6BF850E016715 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
8181
E092A7EA28D10801005C7F67 /* MockMethodChannel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockMethodChannel.swift; sourceTree = "<group>"; };
8282
E092A7EB28D10802005C7F67 /* QuickActionsPluginTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickActionsPluginTests.swift; sourceTree = "<group>"; };
83-
E092A7EC28D10802005C7F67 /* MockShortcutStateManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockShortcutStateManager.swift; sourceTree = "<group>"; };
84-
E092A7F028D10890005C7F67 /* MockShortcutItemService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShortcutItemService.swift; sourceTree = "<group>"; };
85-
E092A7F328D110B3005C7F67 /* DefaultShortcutStateManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultShortcutStateManagerTests.swift; sourceTree = "<group>"; };
83+
E092A7F028D10890005C7F67 /* MockAppShortcutController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAppShortcutController.swift; sourceTree = "<group>"; };
84+
E092A7F328D110B3005C7F67 /* DefaultShortcutItemParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultShortcutItemParserTests.swift; sourceTree = "<group>"; };
8685
E092A7F528D128EB005C7F67 /* RunnerUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerUITests.swift; sourceTree = "<group>"; };
86+
E0A075D429147FE200329BAE /* MockShortcutItemParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockShortcutItemParser.swift; sourceTree = "<group>"; };
8787
F0609304FBCAEC2289164BD5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
8888
/* End PBXFileReference section */
8989

@@ -120,7 +120,7 @@
120120
E092A7F228D10908005C7F67 /* Mocks */,
121121
33E20B3626EFCDFC00A4A191 /* Info.plist */,
122122
E092A7EB28D10802005C7F67 /* QuickActionsPluginTests.swift */,
123-
E092A7F328D110B3005C7F67 /* DefaultShortcutStateManagerTests.swift */,
123+
E092A7F328D110B3005C7F67 /* DefaultShortcutItemParserTests.swift */,
124124
);
125125
path = RunnerTests;
126126
sourceTree = "<group>";
@@ -216,8 +216,8 @@
216216
isa = PBXGroup;
217217
children = (
218218
E092A7EA28D10801005C7F67 /* MockMethodChannel.swift */,
219-
E092A7F028D10890005C7F67 /* MockShortcutItemService.swift */,
220-
E092A7EC28D10802005C7F67 /* MockShortcutStateManager.swift */,
219+
E092A7F028D10890005C7F67 /* MockAppShortcutController.swift */,
220+
E0A075D429147FE200329BAE /* MockShortcutItemParser.swift */,
221221
);
222222
path = Mocks;
223223
sourceTree = "<group>";
@@ -436,9 +436,9 @@
436436
files = (
437437
E092A7EE28D10802005C7F67 /* QuickActionsPluginTests.swift in Sources */,
438438
E092A7ED28D10802005C7F67 /* MockMethodChannel.swift in Sources */,
439-
E092A7F128D10890005C7F67 /* MockShortcutItemService.swift in Sources */,
440-
E092A7EF28D10802005C7F67 /* MockShortcutStateManager.swift in Sources */,
441-
E092A7F428D110B3005C7F67 /* DefaultShortcutStateManagerTests.swift in Sources */,
439+
E092A7F128D10890005C7F67 /* MockAppShortcutController.swift in Sources */,
440+
E0A075D529147FE200329BAE /* MockShortcutItemParser.swift in Sources */,
441+
E092A7F428D110B3005C7F67 /* DefaultShortcutItemParserTests.swift in Sources */,
442442
);
443443
runOnlyForDeploymentPostprocessing = 0;
444444
};
Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import XCTest
77

88
@testable import quick_actions_ios
99

10-
class ShortcutStateManagerTests: XCTestCase {
10+
class DefaultShortcutItemParserTests: XCTestCase {
1111

12-
func testSetShortcutItems_shouldSetItem() {
12+
func testparseShortcutItems() {
1313
let rawItem = [
1414
"type": "SearchTheThing",
1515
"localizedTitle": "Search the thing",
@@ -23,16 +23,12 @@ class ShortcutStateManagerTests: XCTestCase {
2323
icon: UIApplicationShortcutIcon(templateImageName: "search_the_thing.png"),
2424
userInfo: nil)
2525

26-
let mockShortcutItemService = MockShortcutItemService()
27-
let manager = DefaultShortcutStateManager(service: mockShortcutItemService)
28-
29-
manager.setShortcutItems([rawItem])
30-
31-
XCTAssertEqual(mockShortcutItemService.shortcutItems, [expectedItem])
26+
let parser = DefaultShortcutItemParser()
27+
XCTAssertEqual(parser.parseShortcutItems([rawItem]), [expectedItem])
3228

3329
}
3430

35-
func testSetShortcutItems_shouldSetItemWithoutIcon() {
31+
func testparseShortcutItems_noIcon() {
3632
let rawItem: [String: Any] = [
3733
"type": "SearchTheThing",
3834
"localizedTitle": "Search the thing",
@@ -46,11 +42,7 @@ class ShortcutStateManagerTests: XCTestCase {
4642
icon: nil,
4743
userInfo: nil)
4844

49-
let mockShortcutItemService = MockShortcutItemService()
50-
let manager = DefaultShortcutStateManager(service: mockShortcutItemService)
51-
52-
manager.setShortcutItems([rawItem])
53-
54-
XCTAssertEqual(mockShortcutItemService.shortcutItems, [expectedItem])
45+
let parser = DefaultShortcutItemParser()
46+
XCTAssertEqual(parser.parseShortcutItems([rawItem]), [expectedItem])
5547
}
5648
}

packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/Mocks/MockShortcutItemService.swift renamed to packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/Mocks/MockAppShortcutController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
@testable import quick_actions_ios
66

7-
final class MockShortcutItemService: ShortcutItemServicing {
7+
final class MockAppShortcutController: AppShortcutControlling {
88
var shortcutItems: [UIApplicationShortcutItem]? = nil
99
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// MockShortcutItemParser.swift
3+
// RunnerTests
4+
//
5+
// Created by Huan Lin on 11/3/22.
6+
// Copyright © 2022 The Flutter Authors. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
@testable import quick_actions_ios
12+
13+
final class MockShortcutItemParser: ShortcutItemParser {
14+
15+
var parseShortcutItemsStub: ((_ items: [[String: Any]]) -> [UIApplicationShortcutItem])? = nil
16+
17+
func parseShortcutItems(_ items: [[String: Any]]) -> [UIApplicationShortcutItem] {
18+
return parseShortcutItemsStub?(items) ?? []
19+
}
20+
}

packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/Mocks/MockShortcutStateManager.swift

Lines changed: 0 additions & 13 deletions
This file was deleted.

packages/quick_actions/quick_actions_ios/example/ios/RunnerTests/QuickActionsPluginTests.swift

Lines changed: 74 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,57 +15,73 @@ class QuickActionsPluginTests: XCTestCase {
1515
"localizedTitle": "Search the thing",
1616
"icon": "search_the_thing.png",
1717
]
18+
let item = UIApplicationShortcutItem(
19+
type: "SearchTheThing",
20+
localizedTitle: "Search the thing",
21+
localizedSubtitle: nil,
22+
icon: UIApplicationShortcutIcon(templateImageName: "search_the_thing.png"),
23+
userInfo: nil)
24+
1825
let call = FlutterMethodCall(methodName: "setShortcutItems", arguments: [rawItem])
1926

2027
let mockChannel = MockMethodChannel()
21-
let mockShortcutStateManager = MockShortcutStateManager()
28+
let mockAppShortcutController = MockAppShortcutController()
29+
let mockShortcutItemParser = MockShortcutItemParser()
30+
2231
let plugin = QuickActionsPlugin(
23-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
32+
channel: mockChannel,
33+
appShortcutController: mockAppShortcutController,
34+
shortcutItemParser: mockShortcutItemParser)
2435

25-
let setShortcutItemsExpectation = expectation(description: "setShortcutItems must be called.")
26-
mockShortcutStateManager.setShortcutItemsStub = { items in
36+
let parseShortcutItemsExpectation = expectation(
37+
description: "parseShortcutItems must be called.")
38+
mockShortcutItemParser.parseShortcutItemsStub = { items in
2739
XCTAssertEqual(items as? [[String: String]], [rawItem])
28-
setShortcutItemsExpectation.fulfill()
40+
parseShortcutItemsExpectation.fulfill()
41+
return [item]
2942
}
3043

3144
let resultExpectation = expectation(description: "result block must be called.")
3245
plugin.handle(call) { result in
3346
XCTAssertNil(result, "result block must be called with nil.")
3447
resultExpectation.fulfill()
3548
}
36-
49+
XCTAssertEqual(mockAppShortcutController.shortcutItems, [item], "Must set shortcut items.")
3750
waitForExpectations(timeout: 1)
3851
}
3952

4053
func testHandleMethodCall_clearShortcutItems() {
4154
let call = FlutterMethodCall(methodName: "clearShortcutItems", arguments: nil)
4255
let mockChannel = MockMethodChannel()
43-
let mockShortcutStateManager = MockShortcutStateManager()
44-
let plugin = QuickActionsPlugin(
45-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
56+
let mockAppShortcutController = MockAppShortcutController()
57+
let mockShortcutItemParser = MockShortcutItemParser()
4658

47-
let setShortcutItemsExpectation = expectation(description: "setShortcutItems must be called.")
48-
mockShortcutStateManager.setShortcutItemsStub = { items in
49-
XCTAssert(items.isEmpty)
50-
setShortcutItemsExpectation.fulfill()
51-
}
59+
let plugin = QuickActionsPlugin(
60+
channel: mockChannel,
61+
appShortcutController: mockAppShortcutController,
62+
shortcutItemParser: mockShortcutItemParser)
5263

5364
let resultExpectation = expectation(description: "result block must be called.")
5465
plugin.handle(call) { result in
5566
XCTAssertNil(result, "result block must be called with nil.")
5667
resultExpectation.fulfill()
5768
}
5869

70+
XCTAssertEqual(mockAppShortcutController.shortcutItems, [], "Must clear shortcut items.")
5971
waitForExpectations(timeout: 1)
6072
}
6173

6274
func testHandleMethodCall_getLaunchAction() {
6375
let call = FlutterMethodCall(methodName: "getLaunchAction", arguments: nil)
6476

6577
let mockChannel = MockMethodChannel()
66-
let mockShortcutStateManager = MockShortcutStateManager()
78+
let mockAppShortcutController = MockAppShortcutController()
79+
let mockShortcutItemParser = MockShortcutItemParser()
80+
6781
let plugin = QuickActionsPlugin(
68-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
82+
channel: mockChannel,
83+
appShortcutController: mockAppShortcutController,
84+
shortcutItemParser: mockShortcutItemParser)
6985

7086
let resultExpectation = expectation(description: "result block must be called.")
7187
plugin.handle(call) { result in
@@ -80,9 +96,13 @@ class QuickActionsPluginTests: XCTestCase {
8096
let call = FlutterMethodCall(methodName: "nonExist", arguments: nil)
8197

8298
let mockChannel = MockMethodChannel()
83-
let mockShortcutStateManager = MockShortcutStateManager()
99+
let mockAppShortcutController = MockAppShortcutController()
100+
let mockShortcutItemParser = MockShortcutItemParser()
101+
84102
let plugin = QuickActionsPlugin(
85-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
103+
channel: mockChannel,
104+
appShortcutController: mockAppShortcutController,
105+
shortcutItemParser: mockShortcutItemParser)
86106

87107
let resultExpectation = expectation(description: "result block must be called.")
88108

@@ -98,9 +118,13 @@ class QuickActionsPluginTests: XCTestCase {
98118

99119
func testApplicationPerformActionForShortcutItem() {
100120
let mockChannel = MockMethodChannel()
101-
let mockShortcutStateManager = MockShortcutStateManager()
121+
let mockAppShortcutController = MockAppShortcutController()
122+
let mockShortcutItemParser = MockShortcutItemParser()
123+
102124
let plugin = QuickActionsPlugin(
103-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
125+
channel: mockChannel,
126+
appShortcutController: mockAppShortcutController,
127+
shortcutItemParser: mockShortcutItemParser)
104128

105129
let item = UIApplicationShortcutItem(
106130
type: "SearchTheThing",
@@ -128,9 +152,13 @@ class QuickActionsPluginTests: XCTestCase {
128152

129153
func testApplicationDidFinishLaunchingWithOptions_launchWithShortcut() {
130154
let mockChannel = MockMethodChannel()
131-
let mockShortcutStateManager = MockShortcutStateManager()
155+
let mockAppShortcutController = MockAppShortcutController()
156+
let mockShortcutItemParser = MockShortcutItemParser()
157+
132158
let plugin = QuickActionsPlugin(
133-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
159+
channel: mockChannel,
160+
appShortcutController: mockAppShortcutController,
161+
shortcutItemParser: mockShortcutItemParser)
134162

135163
let item = UIApplicationShortcutItem(
136164
type: "SearchTheThing",
@@ -149,9 +177,13 @@ class QuickActionsPluginTests: XCTestCase {
149177

150178
func testApplicationDidFinishLaunchingWithOptions_launchWithoutShortcut() {
151179
let mockChannel = MockMethodChannel()
152-
let mockShortcutStateManager = MockShortcutStateManager()
180+
let mockAppShortcutController = MockAppShortcutController()
181+
let mockShortcutItemParser = MockShortcutItemParser()
182+
153183
let plugin = QuickActionsPlugin(
154-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
184+
channel: mockChannel,
185+
appShortcutController: mockAppShortcutController,
186+
shortcutItemParser: mockShortcutItemParser)
155187

156188
let launchResult = plugin.application(UIApplication.shared, didFinishLaunchingWithOptions: [:])
157189
XCTAssert(
@@ -161,9 +193,13 @@ class QuickActionsPluginTests: XCTestCase {
161193

162194
func testApplicationDidBecomeActive_launchWithoutShortcut() {
163195
let mockChannel = MockMethodChannel()
164-
let mockShortcutStateManager = MockShortcutStateManager()
196+
let mockAppShortcutController = MockAppShortcutController()
197+
let mockShortcutItemParser = MockShortcutItemParser()
198+
165199
let plugin = QuickActionsPlugin(
166-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
200+
channel: mockChannel,
201+
appShortcutController: mockAppShortcutController,
202+
shortcutItemParser: mockShortcutItemParser)
167203

168204
mockChannel.invokeMethodStub = { _, _ in
169205
XCTFail("invokeMethod should not be called if launch without shortcut.")
@@ -186,9 +222,13 @@ class QuickActionsPluginTests: XCTestCase {
186222
userInfo: nil)
187223

188224
let mockChannel = MockMethodChannel()
189-
let mockShortcutStateManager = MockShortcutStateManager()
225+
let mockAppShortcutController = MockAppShortcutController()
226+
let mockShortcutItemParser = MockShortcutItemParser()
227+
190228
let plugin = QuickActionsPlugin(
191-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
229+
channel: mockChannel,
230+
appShortcutController: mockAppShortcutController,
231+
shortcutItemParser: mockShortcutItemParser)
192232

193233
let invokeMethodExpectation = expectation(description: "invokeMethod must be called.")
194234
mockChannel.invokeMethodStub = { method, arguments in
@@ -217,9 +257,13 @@ class QuickActionsPluginTests: XCTestCase {
217257
userInfo: nil)
218258

219259
let mockChannel = MockMethodChannel()
220-
let mockShortcutStateManager = MockShortcutStateManager()
260+
let mockAppShortcutController = MockAppShortcutController()
261+
let mockShortcutItemParser = MockShortcutItemParser()
262+
221263
let plugin = QuickActionsPlugin(
222-
channel: mockChannel, shortcutStateManager: mockShortcutStateManager)
264+
channel: mockChannel,
265+
appShortcutController: mockAppShortcutController,
266+
shortcutItemParser: mockShortcutItemParser)
223267

224268
let invokeMethodExpectation = expectation(description: "invokeMethod must be called.")
225269

packages/quick_actions/quick_actions_ios/ios/Classes/ShortcutItemServicing.swift renamed to packages/quick_actions/quick_actions_ios/ios/Classes/AppShortcutControlling.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
import UIKit
66

7-
/// Services `UIApplicationShortcutItem`s.
8-
protocol ShortcutItemServicing: AnyObject {
7+
/// Controlls app's shortcut behavior.
8+
protocol AppShortcutControlling: AnyObject {
99

1010
/// An array of shortcut items for home screen.
1111
var shortcutItems: [UIApplicationShortcutItem]? { get set }
1212
}
1313

14-
/// A default implementation of the `ShortcutItemServicing` protocol.
15-
extension UIApplication: ShortcutItemServicing {}
14+
/// A default implementation of the `AppShortcutControlling` protocol.
15+
extension UIApplication: AppShortcutControlling {}

0 commit comments

Comments
 (0)