From 10a12e4f811720ef24fe25054203267b544f29ce Mon Sep 17 00:00:00 2001 From: Christian Elies Date: Fri, 21 Feb 2020 23:16:54 +0100 Subject: [PATCH 1/3] test(): implemented some simple unit tests --- .../AdvancedListPaginationStateTests.swift | 45 ++++++++++ .../AdvancedListTests/AdvancedListTests.swift | 89 +++++++++++++++++-- .../Extensions/String+Identifiable.swift | 10 +++ Tests/AdvancedListTests/ListStateTests.swift | 45 ++++++++++ Tests/AdvancedListTests/XCTestManifests.swift | 2 + 5 files changed, 184 insertions(+), 7 deletions(-) create mode 100644 Tests/AdvancedListTests/AdvancedListPaginationStateTests.swift create mode 100644 Tests/AdvancedListTests/Extensions/String+Identifiable.swift create mode 100644 Tests/AdvancedListTests/ListStateTests.swift diff --git a/Tests/AdvancedListTests/AdvancedListPaginationStateTests.swift b/Tests/AdvancedListTests/AdvancedListPaginationStateTests.swift new file mode 100644 index 0000000..655edc6 --- /dev/null +++ b/Tests/AdvancedListTests/AdvancedListPaginationStateTests.swift @@ -0,0 +1,45 @@ +// +// AdvancedListPaginationStateTests.swift +// AdvancedListTests +// +// Created by Christian Elies on 21.02.20. +// + +@testable import AdvancedList +import XCTest + +final class AdvancedListPaginationStateTests: XCTestCase { + func testEqualObjects() { + let object1: AdvancedListPaginationState = .idle + let object2: AdvancedListPaginationState = .idle + XCTAssertEqual(object1, object2) + } + + func testUnequalObjects() { + let object1: AdvancedListPaginationState = .loading + let object2: AdvancedListPaginationState = .idle + XCTAssertNotEqual(object1, object2) + } + + func testEqualError() { + let error = NSError(domain: "MockDomain", code: 0, userInfo: nil) + let object1: AdvancedListPaginationState = .error(error) + let object2: AdvancedListPaginationState = .error(error) + XCTAssertEqual(object1, object2) + } + + func testUnequalError() { + let error1 = NSError(domain: "MockDomain", code: 0, userInfo: nil) + let error2 = NSError(domain: "MockDomain2", code: 1, userInfo: nil) + let object1: AdvancedListPaginationState = .error(error1) + let object2: AdvancedListPaginationState = .error(error2) + XCTAssertNotEqual(object1, object2) + } + + static var allTests = [ + ("testEqualObjects", testEqualObjects), + ("testUnequalObjects", testUnequalObjects), + ("testEqualError", testEqualError), + ("testUnequalError", testUnequalError) + ] +} diff --git a/Tests/AdvancedListTests/AdvancedListTests.swift b/Tests/AdvancedListTests/AdvancedListTests.swift index 231b29b..6dfbf31 100644 --- a/Tests/AdvancedListTests/AdvancedListTests.swift +++ b/Tests/AdvancedListTests/AdvancedListTests.swift @@ -1,15 +1,90 @@ -import XCTest +// +// AdvancedListTests.swift +// AdvancedListTests +// +// Created by Christian Elies on 21.02.20. +// + @testable import AdvancedList +import SwiftUI +import XCTest final class AdvancedListTests: XCTestCase { - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct - // results. - XCTAssertEqual(AdvancedList().text, "Hello, World!") + @State private var listState: ListState = .items + + private let emptyStateView = Text("Empty") + private let errorStateView = Text("Error") + private let loadingStateView = Text("Loading ...") + + override func setUp() { + listState = .items + } + + func testEmptyStateView() { + let items: [String] = [] + + let view = AdvancedList(items, content: { item in Text(item) }, + listState: $listState, + emptyStateView: { self.emptyStateView }, + errorStateView: { _ in self.errorStateView }, + loadingStateView: { self.loadingStateView }, + pagination: .noPagination) + + let body = view.body as? AnyView + XCTAssertNotNil(body) + } + + func testNotEmptyStateView() { + let items: [String] = ["MockItem1", "MockItem2"] + + let view = AdvancedList(items, content: { item in Text(item) }, + listState: $listState, + emptyStateView: { self.emptyStateView }, + errorStateView: { _ in self.errorStateView }, + loadingStateView: { self.loadingStateView }, + pagination: .noPagination) + + let body = view.body as? AnyView + XCTAssertNotNil(body) + } + + func testLoadingStateView() { + listState = .loading + + let items: [String] = [] + + let view = AdvancedList(items, content: { item in Text(item) }, + listState: $listState, + emptyStateView: { self.emptyStateView }, + errorStateView: { _ in self.errorStateView }, + loadingStateView: { self.loadingStateView }, + pagination: .noPagination) + + let body = view.body as? AnyView + XCTAssertNotNil(body) + } + + func testErrorStateView() { + let error = NSError(domain: "MockDomain", code: 1, userInfo: nil) + listState = .error(error) + + let items: [String] = [] + + let view = AdvancedList(items, content: { item in Text(item) }, + listState: $listState, + emptyStateView: { self.emptyStateView }, + errorStateView: { _ in self.errorStateView }, + loadingStateView: { self.loadingStateView }, + pagination: .noPagination) + + let body = view.body as? AnyView + XCTAssertNotNil(body) } static var allTests = [ - ("testExample", testExample), + ("testEmptyStateView", testEmptyStateView), + ("testNotEmptyStateView", testNotEmptyStateView), + ("testLoadingStateView", testLoadingStateView), + ("testErrorStateView", testErrorStateView) ] } diff --git a/Tests/AdvancedListTests/Extensions/String+Identifiable.swift b/Tests/AdvancedListTests/Extensions/String+Identifiable.swift new file mode 100644 index 0000000..d6462c1 --- /dev/null +++ b/Tests/AdvancedListTests/Extensions/String+Identifiable.swift @@ -0,0 +1,10 @@ +// +// String+Identifiable.swift +// AdvancedListTests +// +// Created by Christian Elies on 21.02.20. +// + +extension String: Identifiable { + public var id: String { self } +} diff --git a/Tests/AdvancedListTests/ListStateTests.swift b/Tests/AdvancedListTests/ListStateTests.swift new file mode 100644 index 0000000..b50a2ee --- /dev/null +++ b/Tests/AdvancedListTests/ListStateTests.swift @@ -0,0 +1,45 @@ +// +// ListStateTests.swift +// AdvancedListTests +// +// Created by Christian Elies on 21.02.20. +// + +@testable import AdvancedList +import XCTest + +final class ListStateTests: XCTestCase { + func testEqualObjects() { + let object1: ListState = .items + let object2: ListState = .items + XCTAssertEqual(object1, object2) + } + + func testUnequalObjects() { + let object1: ListState = .items + let object2: ListState = .loading + XCTAssertNotEqual(object1, object2) + } + + func testEqualError() { + let error = NSError(domain: "MockDomain", code: 0, userInfo: nil) + let object1: ListState = .error(error) + let object2: ListState = .error(error) + XCTAssertEqual(object1, object2) + } + + func testUnequalError() { + let error1 = NSError(domain: "MockDomain", code: 0, userInfo: nil) + let error2 = NSError(domain: "MockDomain2", code: 1, userInfo: nil) + let object1: ListState = .error(error1) + let object2: ListState = .error(error2) + XCTAssertNotEqual(object1, object2) + } + + static var allTests = [ + ("testEqualObjects", testEqualObjects), + ("testUnequalObjects", testUnequalObjects), + ("testEqualError", testEqualError), + ("testUnequalError", testUnequalError) + ] +} diff --git a/Tests/AdvancedListTests/XCTestManifests.swift b/Tests/AdvancedListTests/XCTestManifests.swift index 0919b15..3023288 100644 --- a/Tests/AdvancedListTests/XCTestManifests.swift +++ b/Tests/AdvancedListTests/XCTestManifests.swift @@ -3,7 +3,9 @@ import XCTest #if !canImport(ObjectiveC) public func allTests() -> [XCTestCaseEntry] { return [ + testCase(AdvancedListPaginationStateTests.allTests), testCase(AdvancedListTests.allTests), + testCase(ListStateTests.allTests) ] } #endif From 9fca866fcda914e91e7349782a8559486d7fc4ad Mon Sep 17 00:00:00 2001 From: Christian Elies Date: Fri, 21 Feb 2020 23:18:01 +0100 Subject: [PATCH 2/3] docs(readme): added build status and code coverage image shield --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 039ffe9..b8fdf16 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # AdvancedList -[![Swift5](https://img.shields.io/badge/swift5-compatible-green.svg?longCache=true&style=flat-square)](https://developer.apple.com/swift) +[![Swift 5](https://img.shields.io/badge/swift-5-green.svg?longCache=true&style=flat-square)](https://developer.apple.com/swift) [![Platforms](https://img.shields.io/badge/platform-iOS%20%7C%20macOS%20%7C%20tvOS-lightgrey.svg?longCache=true&style=flat-square)](https://www.apple.com) -[![Current Version](https://img.shields.io/github/v/tag/crelies/AdvancedList?longCache=true&style=flat-square)](https://github.com/crelies/AdvancedList) +[![Current version](https://img.shields.io/github/v/tag/crelies/AdvancedList?longCache=true&style=flat-square)](https://github.com/crelies/AdvancedList) +[![Build status](https://travis-ci.com/crelies/AdvancedList.svg?token=THnaziKxRFFz1nKcsPgz&branch=dev)](https://travis-ci.com/crelies/AdvancedList) +[![Code coverage](https://codecov.io/gh/crelies/AdvancedList/branch/dev/graph/badge.svg?token=DhJyoUKNPM)](https://codecov.io/gh/crelies/AdvancedList) [![License](https://img.shields.io/badge/license-MIT-lightgrey.svg?longCache=true&style=flat-square)](https://en.wikipedia.org/wiki/MIT_License) This package provides a wrapper view around the **SwiftUI** `List view` which adds **pagination** (through my [ListPagination package](https://github.com/crelies/ListPagination)) and an **empty**, **error** and **loading state** including a corresponding view. From 4c4d437e6f8489601b607602053b0caa85d216d9 Mon Sep 17 00:00:00 2001 From: Christian Elies Date: Fri, 21 Feb 2020 23:18:21 +0100 Subject: [PATCH 3/3] chore(travis): travis setup --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..456de05 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,8 @@ +language: swift +osx_image: xcode11.3 +script: + - swift package generate-xcodeproj + - xcodebuild clean test -destination 'name=iPhone 8' -scheme AdvancedList-Package -enableCodeCoverage YES -derivedDataPath .build/derivedData -quiet +after_success: + # upload test coverage data + - bash <(curl -s https://codecov.io/bash) -J '^AdvancedList$' -D .build/derivedData \ No newline at end of file