,
80 | httpCode: HTTPCode = 200) throws where T: Encodable {
81 | let mock = try Mock(apiCall: apiCall, baseURL: sut.baseURL, result: result, httpCode: httpCode)
82 | RequestMocking.add(mock: mock)
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/UnitTests/Repositories/PushTokenWebRepositoryTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PushTokenWebRepositoryTests.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 26.04.2020.
6 | // Copyright © 2020 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import Combine
11 | @testable import CountriesSwiftUI
12 |
13 | class PushTokenWebRepositoryTests: XCTestCase {
14 |
15 | private var sut: RealPushTokenWebRepository!
16 | private var cancelBag = CancelBag()
17 |
18 | override func setUp() {
19 | sut = RealPushTokenWebRepository(session: .mockedResponsesOnly,
20 | baseURL: "https://test.com")
21 | }
22 |
23 | override func tearDown() {
24 | cancelBag = CancelBag()
25 | }
26 |
27 | func test_register() {
28 | let exp = XCTestExpectation(description: #function)
29 | sut.register(devicePushToken: Data())
30 | .sinkToResult { result in
31 | result.assertSuccess()
32 | exp.fulfill()
33 | }
34 | .store(in: cancelBag)
35 | wait(for: [exp], timeout: 0.1)
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/UnitTests/Resources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/UnitTests/Resources/svg_convert_02.html:
--------------------------------------------------------------------------------
1 | ![[svg-to-png output image]](//im2.ezgif.com/tmp/ezgif-2-91963ddbaa7a.png)
File size: 5.02KiB (+438.47%), width: 300px, height: 200px, type: png
Please do not directly link this file, but save it when finished.
The image will soon be deleted from our servers.
You can host images at sites like imgur.com
--------------------------------------------------------------------------------
/UnitTests/System/AppDelegateTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegateTests.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 26.04.2020.
6 | // Copyright © 2020 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import UIKit
11 | @testable import CountriesSwiftUI
12 |
13 | final class AppDelegateTests: XCTestCase {
14 |
15 | func test_didFinishLaunching() {
16 | let sut = AppDelegate()
17 | let eventsHandler = MockedSystemEventsHandler(expected: [])
18 | sut.systemEventsHandler = eventsHandler
19 | _ = sut.application(UIApplication.shared, didFinishLaunchingWithOptions: [:])
20 | eventsHandler.verify()
21 | }
22 |
23 | func test_pushRegistration() {
24 | let sut = AppDelegate()
25 | let eventsHandler = MockedSystemEventsHandler(expected: [
26 | .pushRegistration, .pushRegistration
27 | ])
28 | sut.systemEventsHandler = eventsHandler
29 | sut.application(UIApplication.shared, didRegisterForRemoteNotificationsWithDeviceToken: Data())
30 | sut.application(UIApplication.shared, didFailToRegisterForRemoteNotificationsWithError: NSError.test)
31 | eventsHandler.verify()
32 | }
33 |
34 | func test_didRecevieRemoteNotification() {
35 | let sut = AppDelegate()
36 | let eventsHandler = MockedSystemEventsHandler(expected: [
37 | .recevieRemoteNotification
38 | ])
39 | sut.systemEventsHandler = eventsHandler
40 | sut.application(UIApplication.shared, didReceiveRemoteNotification: [:], fetchCompletionHandler: { _ in })
41 | eventsHandler.verify()
42 | }
43 |
44 | func test_systemEventsHandler() {
45 | let sut = AppDelegate()
46 | let handler = sut.systemEventsHandler
47 | XCTAssertTrue(handler is RealSystemEventsHandler)
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/UnitTests/System/DeepLinksHandlerTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DeepLinksHandlerTests.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 26.04.2020.
6 | // Copyright © 2020 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import CountriesSwiftUI
11 |
12 | class DeepLinksHandlerTests: XCTestCase {
13 |
14 | func test_noSideEffectOnInit() {
15 | let interactors: DIContainer.Interactors = .mocked()
16 | let container = DIContainer(appState: AppState(), interactors: interactors)
17 | _ = RealDeepLinksHandler(container: container)
18 | interactors.verify()
19 | XCTAssertEqual(container.appState.value, AppState())
20 | }
21 |
22 | func test_openingDeeplinkFromDefaultRouting() {
23 | let interactors: DIContainer.Interactors = .mocked()
24 | let initialState = AppState()
25 | let container = DIContainer(appState: initialState, interactors: interactors)
26 | let sut = RealDeepLinksHandler(container: container)
27 | sut.open(deepLink: .showCountryFlag(alpha3Code: "ITA"))
28 | XCTAssertNil(initialState.routing.countriesList.countryDetails)
29 | XCTAssertFalse(initialState.routing.countryDetails.detailsSheet)
30 | var expectedState = AppState()
31 | expectedState.routing.countriesList.countryDetails = "ITA"
32 | expectedState.routing.countryDetails.detailsSheet = true
33 | interactors.verify()
34 | XCTAssertEqual(container.appState.value, expectedState)
35 | }
36 |
37 | func test_openingDeeplinkFromNonDefaultRouting() {
38 | let interactors: DIContainer.Interactors = .mocked()
39 | var initialState = AppState()
40 | initialState.routing.countriesList.countryDetails = "FRA"
41 | initialState.routing.countryDetails.detailsSheet = true
42 | let container = DIContainer(appState: initialState, interactors: interactors)
43 | let sut = RealDeepLinksHandler(container: container)
44 | sut.open(deepLink: .showCountryFlag(alpha3Code: "ITA"))
45 |
46 | let resettedState = AppState()
47 | var finalState = AppState()
48 | finalState.routing.countriesList.countryDetails = "ITA"
49 | finalState.routing.countryDetails.detailsSheet = true
50 |
51 | XCTAssertEqual(container.appState.value, resettedState)
52 | let exp = XCTestExpectation(description: #function)
53 | DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
54 | interactors.verify()
55 | XCTAssertEqual(container.appState.value, finalState)
56 | exp.fulfill()
57 | }
58 | wait(for: [exp], timeout: 2.5)
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/UnitTests/System/PushNotificationsHandlerTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PushNotificationsHandlerTests.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 26.04.2020.
6 | // Copyright © 2020 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import UserNotifications
11 | @testable import CountriesSwiftUI
12 |
13 | class PushNotificationsHandlerTests: XCTestCase {
14 |
15 | var sut: RealPushNotificationsHandler!
16 |
17 | func test_isCenterDelegate() {
18 | let mockedHandler = MockedDeepLinksHandler(expected: [])
19 | sut = RealPushNotificationsHandler(deepLinksHandler: mockedHandler)
20 | let center = UNUserNotificationCenter.current()
21 | XCTAssertTrue(center.delegate === sut)
22 | mockedHandler.verify()
23 | }
24 |
25 | func test_emptyPayload() {
26 | let mockedHandler = MockedDeepLinksHandler(expected: [])
27 | sut = RealPushNotificationsHandler(deepLinksHandler: mockedHandler)
28 | let exp = XCTestExpectation(description: #function)
29 | sut.handleNotification(userInfo: [:]) {
30 | mockedHandler.verify()
31 | exp.fulfill()
32 | }
33 | wait(for: [exp], timeout: 0.1)
34 | }
35 |
36 | func test_deepLinkPayload() {
37 | let mockedHandler = MockedDeepLinksHandler(expected: [
38 | .open(.showCountryFlag(alpha3Code: "USA"))
39 | ])
40 | sut = RealPushNotificationsHandler(deepLinksHandler: mockedHandler)
41 | let exp = XCTestExpectation(description: #function)
42 | let userInfo: [String: Any] = [
43 | "aps": ["country": "USA"]
44 | ]
45 | sut.handleNotification(userInfo: userInfo) {
46 | mockedHandler.verify()
47 | exp.fulfill()
48 | }
49 | wait(for: [exp], timeout: 0.1)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/UnitTests/System/SceneDelegateTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegateTests.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 26.04.2020.
6 | // Copyright © 2020 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import UIKit
11 | @testable import CountriesSwiftUI
12 |
13 | final class SceneDelegateTests: XCTestCase {
14 |
15 | private lazy var scene: UIScene = {
16 | UIApplication.shared.connectedScenes.first!
17 | }()
18 |
19 | func test_openURLContexts() {
20 | let sut = SceneDelegate()
21 | let eventsHandler = MockedSystemEventsHandler(expected: [
22 | .openURL
23 | ])
24 | sut.systemEventsHandler = eventsHandler
25 | sut.scene(scene, openURLContexts: .init())
26 | eventsHandler.verify()
27 | }
28 |
29 | func test_didBecomeActive() {
30 | let sut = SceneDelegate()
31 | let eventsHandler = MockedSystemEventsHandler(expected: [
32 | .becomeActive
33 | ])
34 | sut.systemEventsHandler = eventsHandler
35 | sut.sceneDidBecomeActive(scene)
36 | eventsHandler.verify()
37 | }
38 |
39 | func test_willResignActive() {
40 | let sut = SceneDelegate()
41 | let eventsHandler = MockedSystemEventsHandler(expected: [
42 | .resignActive
43 | ])
44 | sut.systemEventsHandler = eventsHandler
45 | sut.sceneWillResignActive(scene)
46 | eventsHandler.verify()
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/UnitTests/System/UIOpenURLContext_Init.h:
--------------------------------------------------------------------------------
1 | //
2 | // UIOpenURLContext+UIOpenURLContext_Init.h
3 | // UnitTests
4 | //
5 | // Created by Alexey on 18.05.2021.
6 | // Copyright © 2021 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface UIOpenURLContext (Init)
14 |
15 | + (instancetype)createInstance;
16 |
17 | @end
18 |
19 | NS_ASSUME_NONNULL_END
20 |
--------------------------------------------------------------------------------
/UnitTests/System/UIOpenURLContext_Init.m:
--------------------------------------------------------------------------------
1 | //
2 | // UIOpenURLContext_Init.m
3 | // UnitTests
4 | //
5 | // Created by Alexey on 18.05.2021.
6 | // Copyright © 2021 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | #import "UIOpenURLContext_Init.h"
10 |
11 | @implementation UIOpenURLContext (Init)
12 |
13 | + (instancetype)createInstance {
14 | return [[self alloc] init];
15 | }
16 |
17 | @end
18 |
--------------------------------------------------------------------------------
/UnitTests/System/UnitTests-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 | #import "UIOpenURLContext_Init.h"
6 |
--------------------------------------------------------------------------------
/UnitTests/TestHelpers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TestHelpers.swift
3 | // UnitTests
4 | //
5 | // Created by Alexey Naumov on 30.10.2019.
6 | // Copyright © 2019 Alexey Naumov. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | import SwiftUI
11 | import Combine
12 | import ViewInspector
13 | @testable import CountriesSwiftUI
14 |
15 | // MARK: - UI
16 |
17 | extension UIColor {
18 | func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
19 | let format = UIGraphicsImageRendererFormat()
20 | format.scale = 1
21 | return UIGraphicsImageRenderer(size: size, format: format).image { rendererContext in
22 | setFill()
23 | rendererContext.fill(CGRect(origin: .zero, size: size))
24 | }
25 | }
26 | }
27 |
28 | // MARK: - Result
29 |
30 | extension Result where Success: Equatable {
31 | func assertSuccess(value: Success, file: StaticString = #file, line: UInt = #line) {
32 | switch self {
33 | case let .success(resultValue):
34 | XCTAssertEqual(resultValue, value, file: file, line: line)
35 | case let .failure(error):
36 | XCTFail("Unexpected error: \(error)", file: file, line: line)
37 | }
38 | }
39 | }
40 |
41 | extension Result where Success == Void {
42 | func assertSuccess(file: StaticString = #file, line: UInt = #line) {
43 | switch self {
44 | case let .failure(error):
45 | XCTFail("Unexpected error: \(error)", file: file, line: line)
46 | case .success:
47 | break
48 | }
49 | }
50 | }
51 |
52 | extension Result {
53 | func assertFailure(_ message: String? = nil, file: StaticString = #file, line: UInt = #line) {
54 | switch self {
55 | case let .success(value):
56 | XCTFail("Unexpected success: \(value)", file: file, line: line)
57 | case let .failure(error):
58 | if let message = message {
59 | XCTAssertEqual(error.localizedDescription, message, file: file, line: line)
60 | }
61 | }
62 | }
63 | }
64 |
65 | extension Result {
66 | func publish() -> AnyPublisher {
67 | return publisher.publish()
68 | }
69 | }
70 |
71 | extension Publisher {
72 | func publish() -> AnyPublisher