Skip to content

Commit 67554ae

Browse files
authored
Merge pull request #18 from nativeapptemplate/add_test
Add unit tests for models, utilities, and extensions
2 parents c03f6cb + 44630bb commit 67554ae

7 files changed

Lines changed: 282 additions & 0 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// TabViewModelTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
import Foundation
7+
@testable import NativeAppTemplate
8+
import Testing
9+
10+
@MainActor
11+
@Suite
12+
struct TabViewModelTest {
13+
@Test
14+
func initialState() {
15+
let viewModel = TabViewModel()
16+
17+
#expect(viewModel.selectedTab == .shops)
18+
for tab in MainTab.allCases {
19+
#expect(viewModel.showingDetailView[tab] == false)
20+
}
21+
}
22+
23+
@Test
24+
func showingDetailView() {
25+
let viewModel = TabViewModel()
26+
27+
viewModel.showingDetailView[.shops] = true
28+
#expect(viewModel.showingDetailView[.shops] == true)
29+
#expect(viewModel.showingDetailView[.scan] == false)
30+
#expect(viewModel.showingDetailView[.settings] == false)
31+
32+
viewModel.showingDetailView[.shops] = false
33+
#expect(viewModel.showingDetailView[.shops] == false)
34+
}
35+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//
2+
// StringExtensionsTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
import CoreGraphics
7+
@testable import NativeAppTemplate
8+
import Testing
9+
10+
struct StringExtensionsTest {
11+
@Test(arguments: [
12+
("hello123", true),
13+
("ABC", true),
14+
("abc", true),
15+
("123", true),
16+
("Hello World", false),
17+
("hello!", false),
18+
("hello@world", false),
19+
("", false)
20+
])
21+
func isAlphanumeric(input: String, expected: Bool) {
22+
#expect(input.isAlphanumeric() == expected)
23+
}
24+
25+
@Test
26+
func isAlphanumericIgnoringDiacritics() {
27+
#expect("hello123".isAlphanumeric(ignoreDiacritics: true) == true)
28+
#expect("ABC123".isAlphanumeric(ignoreDiacritics: true) == true)
29+
#expect("hello world".isAlphanumeric(ignoreDiacritics: true) == false)
30+
#expect("".isAlphanumeric(ignoreDiacritics: true) == false)
31+
}
32+
33+
@Test
34+
func imageGeneration() {
35+
let image = "A".image(size: CGSize(width: 50, height: 50))
36+
#expect(image != nil)
37+
}
38+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// ItemTagStateTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
@testable import NativeAppTemplate
7+
import Testing
8+
9+
struct ItemTagStateTest {
10+
@Test
11+
func initFromValidStrings() {
12+
#expect(ItemTagState(string: "idled") == .idled)
13+
#expect(ItemTagState(string: "completed") == .completed)
14+
}
15+
16+
@Test
17+
func initFromUnknownStringDefaultsToIdled() {
18+
#expect(ItemTagState(string: "unknown") == .idled)
19+
#expect(ItemTagState(string: "") == .idled)
20+
}
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// ItemTagTypeTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
@testable import NativeAppTemplate
7+
import Testing
8+
9+
struct ItemTagTypeTest {
10+
@Test
11+
func initFromValidStrings() {
12+
#expect(ItemTagType(string: "server") == .server)
13+
#expect(ItemTagType(string: "customer") == .customer)
14+
}
15+
16+
@Test
17+
func initFromUnknownStringDefaultsToServer() {
18+
#expect(ItemTagType(string: "unknown") == .server)
19+
#expect(ItemTagType(string: "") == .server)
20+
}
21+
22+
@Test
23+
func toJsonRoundtrip() {
24+
#expect(ItemTagType(string: ItemTagType.server.toJson()) == .server)
25+
#expect(ItemTagType(string: ItemTagType.customer.toJson()) == .customer)
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// ScanStateTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
@testable import NativeAppTemplate
7+
import Testing
8+
9+
struct ScanStateTest {
10+
@Test
11+
func initFromValidStrings() {
12+
#expect(ScanState(string: "unscanned") == .unscanned)
13+
#expect(ScanState(string: "scanned") == .scanned)
14+
}
15+
16+
@Test
17+
func initFromUnknownStringDefaultsToUnscanned() {
18+
#expect(ScanState(string: "unknown") == .unscanned)
19+
#expect(ScanState(string: "") == .unscanned)
20+
}
21+
22+
@Test
23+
func toJsonRoundtrip() {
24+
#expect(ScanState(string: ScanState.unscanned.toJson()) == .unscanned)
25+
#expect(ScanState(string: ScanState.scanned.toJson()) == .scanned)
26+
}
27+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//
2+
// MessageBusTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
@testable import NativeAppTemplate
7+
import Testing
8+
9+
@MainActor
10+
@Suite
11+
struct MessageBusTest {
12+
@Test
13+
func initialState() {
14+
let bus = MessageBus()
15+
16+
#expect(bus.currentMessage == nil)
17+
#expect(bus.messageVisible == false)
18+
}
19+
20+
@Test
21+
func postMessageSetsCurrentMessage() {
22+
let bus = MessageBus()
23+
24+
bus.post(message: Message(level: .success, message: "Done"))
25+
26+
#expect(bus.currentMessage != nil)
27+
#expect(bus.currentMessage?.message == "Done")
28+
#expect(bus.currentMessage?.level == .success)
29+
#expect(bus.messageVisible == true)
30+
}
31+
32+
@Test
33+
func postErrorMessage() {
34+
let bus = MessageBus()
35+
36+
bus.post(message: Message(level: .error, message: "Failed", autoDismiss: false))
37+
38+
#expect(bus.currentMessage?.level == .error)
39+
#expect(bus.currentMessage?.message == "Failed")
40+
#expect(bus.currentMessage?.autoDismiss == false)
41+
#expect(bus.messageVisible == true)
42+
}
43+
44+
@Test
45+
func dismiss() {
46+
let bus = MessageBus()
47+
48+
bus.post(message: Message(level: .success, message: "Done"))
49+
#expect(bus.messageVisible == true)
50+
51+
bus.dismiss()
52+
#expect(bus.messageVisible == false)
53+
}
54+
55+
@Test
56+
func postReplacesExistingMessage() {
57+
let bus = MessageBus()
58+
59+
bus.post(message: Message(level: .success, message: "First"))
60+
bus.post(message: Message(level: .error, message: "Second"))
61+
62+
#expect(bus.currentMessage?.message == "Second")
63+
#expect(bus.currentMessage?.level == .error)
64+
}
65+
66+
@Test
67+
func snackbarState() {
68+
let message = Message(level: .error, message: "Error occurred")
69+
let snackbarState = message.snackbarState
70+
71+
#expect(snackbarState.status == .error)
72+
#expect(snackbarState.message == "Error occurred")
73+
}
74+
75+
@Test
76+
func messageLevelSnackbarStatus() {
77+
#expect(Message.Level.error.snackbarStatus == .error)
78+
#expect(Message.Level.warning.snackbarStatus == .warning)
79+
#expect(Message.Level.success.snackbarStatus == .success)
80+
}
81+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// UtilityTest.swift
3+
// NativeAppTemplate
4+
//
5+
6+
import Foundation
7+
@testable import NativeAppTemplate
8+
import Testing
9+
10+
struct UtilityTest {
11+
@Test
12+
func scanUrlContainsExpectedParams() {
13+
let url = Utility.scanUrl(itemTagId: "abc-123", itemTagType: "server")
14+
15+
#expect(url.absoluteString.contains("item_tag_id=abc-123"))
16+
#expect(url.absoluteString.contains("type=server"))
17+
}
18+
19+
@Test
20+
func scanUrlCustomerType() {
21+
let url = Utility.scanUrl(itemTagId: "xyz-456", itemTagType: "customer")
22+
23+
#expect(url.absoluteString.contains("item_tag_id=xyz-456"))
24+
#expect(url.absoluteString.contains("type=customer"))
25+
}
26+
27+
@Test(arguments: [
28+
("", true),
29+
(" ", true),
30+
("\n", true),
31+
(" \t\n ", true),
32+
("hello", false),
33+
(" hello ", false)
34+
])
35+
func isBlank(text: String, expected: Bool) {
36+
#expect(Utility.isBlank(text) == expected)
37+
}
38+
39+
@Test(arguments: [
40+
("test@example.com", true),
41+
("user.name+tag@domain.co", true),
42+
("user@domain.com", true),
43+
("", false),
44+
("notanemail", false),
45+
("@domain.com", false),
46+
("user@", false),
47+
("user@.com", false)
48+
])
49+
func validateEmail(email: String, expected: Bool) {
50+
#expect(Utility.validateEmail(email) == expected)
51+
}
52+
53+
}

0 commit comments

Comments
 (0)