diff --git a/.swiftlint.yml b/.swiftlint.yml index ab86dc0..4e2d4ba 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -13,6 +13,7 @@ disabled_rules: - function_body_length - for_where - multiple_closures_with_trailing_closure + - class_delegate_protocol excluded: # paths to ignore during linting. Takes precedence over `included`. - Carthage @@ -21,4 +22,3 @@ excluded: # paths to ignore during linting. Takes precedence over `included`. - UserTest+CoreDataProperties.swift - GradeType+CoreDataProperties.swift - AppSettings+CoreDataProperties.swift - - class_delegate_protocol diff --git a/Calq.xcodeproj/project.pbxproj b/Calq.xcodeproj/project.pbxproj index 06b6aef..c9db769 100644 --- a/Calq.xcodeproj/project.pbxproj +++ b/Calq.xcodeproj/project.pbxproj @@ -53,7 +53,6 @@ F1A53D002A196BFF0045C5B0 /* ListBackgroundModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A53CFF2A196BFF0045C5B0 /* ListBackgroundModifier.swift */; }; F1A53D032A196C220045C5B0 /* WeightViewmodel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A53D022A196C220045C5B0 /* WeightViewmodel.swift */; }; F1A59A3E2A6347880039C95E /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A59A3D2A6347880039C95E /* ToastView.swift */; }; - F1A6BC422B543A59001BD833 /* FeedbackService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A6BC412B543A59001BD833 /* FeedbackService.swift */; }; F1A6BC442B543B47001BD833 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A6BC432B543B47001BD833 /* Reachability.swift */; }; F1A6BC462B543DBB001BD833 /* Util+Sorting.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A6BC452B543DBB001BD833 /* Util+Sorting.swift */; }; F1A7102B2A4345BF00255F10 /* NewGradeVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A7102A2A4345BF00255F10 /* NewGradeVM.swift */; }; @@ -99,6 +98,9 @@ F1B8018B2AADD9EA003DBE47 /* exampleData_v2.json in Resources */ = {isa = PBXBuildFile; fileRef = F1B8018A2AADD9EA003DBE47 /* exampleData_v2.json */; }; F1BC83E92AA78F17000D7CD2 /* JSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BC83E82AA78F17000D7CD2 /* JSONTests.swift */; }; F1BD15712BA1A7FE00CE570D /* NSManagedObjectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD15702BA1A7FE00CE570D /* NSManagedObjectExtension.swift */; }; + F1BD15752BA1B83800CE570D /* GradeTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD15742BA1B83800CE570D /* GradeTypeTests.swift */; }; + F1BD15772BA1B86600CE570D /* SubjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD15762BA1B86600CE570D /* SubjectTests.swift */; }; + F1BD15792BA1B87300CE570D /* CoreDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD15782BA1B87300CE570D /* CoreDataTests.swift */; }; F1BD65A32B6296DB003B8D34 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD65A22B6296DB003B8D34 /* DateExtension.swift */; }; F1BD65A52B6296FB003B8D34 /* BackupJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD65A42B6296FB003B8D34 /* BackupJSON.swift */; }; F1BD65A62B629991003B8D34 /* BackupJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1BD65A42B6296FB003B8D34 /* BackupJSON.swift */; }; @@ -207,7 +209,6 @@ F1A53CFF2A196BFF0045C5B0 /* ListBackgroundModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListBackgroundModifier.swift; sourceTree = ""; }; F1A53D022A196C220045C5B0 /* WeightViewmodel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeightViewmodel.swift; sourceTree = ""; }; F1A59A3D2A6347880039C95E /* ToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = ""; }; - F1A6BC412B543A59001BD833 /* FeedbackService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackService.swift; sourceTree = ""; }; F1A6BC432B543B47001BD833 /* Reachability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = ""; }; F1A6BC452B543DBB001BD833 /* Util+Sorting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Util+Sorting.swift"; sourceTree = ""; }; F1A7102A2A4345BF00255F10 /* NewGradeVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewGradeVM.swift; sourceTree = ""; }; @@ -243,6 +244,9 @@ F1B8018A2AADD9EA003DBE47 /* exampleData_v2.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = exampleData_v2.json; sourceTree = ""; }; F1BC83E82AA78F17000D7CD2 /* JSONTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONTests.swift; sourceTree = ""; }; F1BD15702BA1A7FE00CE570D /* NSManagedObjectExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObjectExtension.swift; sourceTree = ""; }; + F1BD15742BA1B83800CE570D /* GradeTypeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradeTypeTests.swift; sourceTree = ""; }; + F1BD15762BA1B86600CE570D /* SubjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubjectTests.swift; sourceTree = ""; }; + F1BD15782BA1B87300CE570D /* CoreDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataTests.swift; sourceTree = ""; }; F1BD65A22B6296DB003B8D34 /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = ""; }; F1BD65A42B6296FB003B8D34 /* BackupJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupJSON.swift; sourceTree = ""; }; F1BE91C12A41DF2A00E85494 /* SubjectListVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubjectListVM.swift; sourceTree = ""; }; @@ -372,7 +376,6 @@ F14140472A476408007E4648 /* AppStoreRating.swift */, F1A05C5E2A642670003734F2 /* StringExtension.swift */, F1C2CAD72B22620E00C51D15 /* SegmentedPickerView.swift */, - F1A6BC412B543A59001BD833 /* FeedbackService.swift */, F1A6BC432B543B47001BD833 /* Reachability.swift */, F1A6BC452B543DBB001BD833 /* Util+Sorting.swift */, F1BD65A22B6296DB003B8D34 /* DateExtension.swift */, @@ -484,6 +487,7 @@ F1B386452A1CFE6800F0C5AC /* CalqTests */ = { isa = PBXGroup; children = ( + F1BD15732BA1B81700CE570D /* Util */, F1B52D162A323BCB0082DEBE /* MockCoreDataStack.swift */, F1B386462A1CFE6800F0C5AC /* CalqTests.swift */, F1B292DE2A3BC1DF00AF2ACD /* MockDataProvider.swift */, @@ -505,6 +509,16 @@ path = Backup; sourceTree = ""; }; + F1BD15732BA1B81700CE570D /* Util */ = { + isa = PBXGroup; + children = ( + F1BD15742BA1B83800CE570D /* GradeTypeTests.swift */, + F1BD15762BA1B86600CE570D /* SubjectTests.swift */, + F1BD15782BA1B87300CE570D /* CoreDataTests.swift */, + ); + path = Util; + sourceTree = ""; + }; F1BE91C32A41DF3200E85494 /* SubjectList */ = { isa = PBXGroup; children = ( @@ -811,7 +825,6 @@ F17F4442298C4DDF000A3993 /* TabView.swift in Sources */, F1B0B16A299648A200F3D1FD /* EditSubjectScreen.swift in Sources */, F1A7723F2A1795C6004B8DCC /* UserTest+CoreDataProperties.swift in Sources */, - F1A6BC422B543A59001BD833 /* FeedbackService.swift in Sources */, F1B0B16E29968D4700F3D1FD /* FirstLaunchScreen.swift in Sources */, F192DD24299D10CB0077B905 /* NewSubject.swift in Sources */, F1B2732429B5F53900E841F4 /* ButtonStyle.swift in Sources */, @@ -844,12 +857,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F1BD15772BA1B86600CE570D /* SubjectTests.swift in Sources */, + F1BD15752BA1B83800CE570D /* GradeTypeTests.swift in Sources */, F1B52D172A323BCB0082DEBE /* MockCoreDataStack.swift in Sources */, F1DD87EE2AA795910095C057 /* LineChartTests.swift in Sources */, F1B292DF2A3BC1DF00AF2ACD /* MockDataProvider.swift in Sources */, F1B386472A1CFE6800F0C5AC /* CalqTests.swift in Sources */, F1DD87F02AA799700095C057 /* BarChartTests.swift in Sources */, F1BC83E92AA78F17000D7CD2 /* JSONTests.swift in Sources */, + F1BD15792BA1B87300CE570D /* CoreDataTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Calq/Screens/SettingsScreens/SettingsScreen/SettingsScreen.swift b/Calq/Screens/SettingsScreens/SettingsScreen/SettingsScreen.swift index c7feaf6..3da9b0a 100644 --- a/Calq/Screens/SettingsScreens/SettingsScreen/SettingsScreen.swift +++ b/Calq/Screens/SettingsScreens/SettingsScreen/SettingsScreen.swift @@ -48,9 +48,6 @@ struct SettingsScreen: View { } } } - .sheet(isPresented: $vm.showFeedbackSheet, content: { - feeedbackSheet() - }) .alert(isPresented: $vm.deleteAlert) { settingsAlert() } @@ -137,10 +134,6 @@ struct SettingsScreen: View { UIApplication.shared.open(url) } }) - - /* SettingsIcon(color: Color(hexString: "c14f9f"), icon: "bubble.right.fill", text: "settings.feedback.title") { - vm.showFeedbackSheet = true - }*/ } } @@ -219,34 +212,6 @@ struct SettingsScreen: View { }.buttonStyle(MenuPickerDestructive()) } } - - func feeedbackSheet() -> some View { - VStack { - Text("settings.feedback.title") - .font(.headline) - - if vm.feedbackError { - Text("settings.feedback.error") - .foregroundColor(.red) - } - - TextEditor(text: $vm.feedbackContent) - .multilineTextAlignment(.leading) - .background(Color.gray.opacity(0.3)) - .cornerRadius(8) - .frame(minHeight: 50) - .shadow(radius: 5) - - Text("\(vm.feedbackContent.count)settings.feedback.textlimit") - .foregroundColor(vm.feedbackContent.count >= 1000 ? .red : .gray) - .font(.footnote) - - Button("settings.feedback.button", action: { - vm.sendFeedback() - }).disabled(vm.feedbackContent.count >= 1000) - .buttonStyle(PrimaryStyle()) - }.padding() - } } struct SettingsIcon: View { diff --git a/Calq/Screens/SettingsScreens/SettingsScreen/SettingsVM.swift b/Calq/Screens/SettingsScreens/SettingsScreen/SettingsVM.swift index cd9951a..f3698fa 100644 --- a/Calq/Screens/SettingsScreens/SettingsScreen/SettingsVM.swift +++ b/Calq/Screens/SettingsScreens/SettingsScreen/SettingsVM.swift @@ -99,14 +99,4 @@ class SettingsViewModel: ObservableObject { selectedSubjet = subject editSubjectPresented = true } - - func sendFeedback() { - if FeedbackService.sendFeedback(feedbackContent) { - showFeedbackSheet = false - feedbackContent = "ABC" - feedbackError = false - } else { - feedbackError = true - } - } } diff --git a/Calq/lib/FeedbackService.swift b/Calq/lib/FeedbackService.swift deleted file mode 100644 index a39d14f..0000000 --- a/Calq/lib/FeedbackService.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// FeedbackService.swift -// Calq -// -// Created by Kiara on 14.01.24. -// - -import Foundation -import UIKit - -class FeedbackService { - static let version = "Version: \(appVersion) Build: \(buildVersion)" - static let app = Bundle.main.infoDictionary?["CFBundleName"] ?? "Calq" - static let device = UIDevice.current.name + " iOS: " + UIDevice.current.systemVersion - - static func sendFeedback(_ content: String) -> Bool { - guard let url = URL(string: "https://discord.com/api/webhooks/1195726763649671168/XQATWsv9xGYVdamGsZDuc6kPX3hGyu5v5iC_wWssqErq2riswmA3vriFKMbiOcq6Pvxs") else { return false } - if !Reachability.isConnectedToNetwork() { - return false - } - - let message = "\(content)\n-----------------------\n**\(version)**\n*\(device)*" - - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.addValue("application/json", forHTTPHeaderField: "content-type") - request.httpBody = makeEmbed(message) - - let task = URLSession.shared.dataTask(with: request) - task.resume() - return true - } - - private static func makeEmbed(_ content: String) -> Data { - let feedback = Feedback(embeds: [Feedback.Embed(title: "\(app) Feedback", color: "7194610", description: content)]) - - do { - let data = try JSONEncoder().encode(feedback) - return data - } catch { - return Data() - } - } -} - -struct Feedback: Codable { - var embeds: [Embed] - - struct Embed: Codable { - var title: String - var color: String - var description: String - } -} diff --git a/CalqTests/CalqTests.swift b/CalqTests/CalqTests.swift index 49bedea..3c55d04 100644 --- a/CalqTests/CalqTests.swift +++ b/CalqTests/CalqTests.swift @@ -69,148 +69,13 @@ final class CalqTests: XCTestCase { XCTAssertEqual( UserDefaults.standard.integer(forKey: UD_primaryType), 1) } - // MARK: CoreData - func testDeleteData() { - Util.deleteSettings() - - let count = Util.getAllSubjects().count - XCTAssertEqual(count, 0) - let types = Util.getTypes().count - XCTAssertEqual(types, 2) - } - + // MARK: Averages func testAverageString() { - let average = Util.averageString(MockDataProvider.getSubjectWithTests()) - XCTAssertEqual(average, "-- 11 -- -- ") - } - - func testAverageString_WithoutTests() { - let average = Util.averageString(MockDataProvider.getSubjectWithoutTests()) - XCTAssertEqual(average, "-- -- -- -- ") - } - - // MARK: Inactive Year funcs - func testDeactivateHalfyear() { JSON.loadDemoData() - - let before = Util.getinactiveYears(getExampleSub()) - XCTAssertEqual(before.count, 0) - - let subject = Util.addYear(getExampleSub(), 3) - let after = Util.getinactiveYears(subject) - - XCTAssertEqual(after.count, 1) + let subject = getExampleSub() + XCTAssertEqual(Util.averageString(subject), "15 15 14 15") } - func testAddInactiveHalfyearTwice() { - JSON.loadDemoData() - - Util.addYear(getExampleSub(), 3) - let firstResult = Util.getinactiveYears(getExampleSub()) - XCTAssertEqual(firstResult.count, 1) - - Util.addYear(getExampleSub(), 3) - - let secondResult = Util.getinactiveYears(getExampleSub()) - XCTAssertEqual(secondResult.count, 1) - } - - func testRemoveNotAddedInactiveHalfyear() { - JSON.loadDemoData() - - Util.addYear(getExampleSub(), 3) - let firstResult = Util.getinactiveYears(getExampleSub()) - XCTAssertEqual(firstResult.count, 1) - - Util.removeYear(getExampleSub(), 4) - - let secondResult = Util.getinactiveYears(getExampleSub()) - XCTAssertEqual(secondResult.count, 1) - } - - func testLastActiveYear() { - JSON.loadDemoData() - let lastYear = Util.lastActiveYear(getExampleSub()) - XCTAssertEqual(lastYear, 4) - } - - // MARK: Subjects - func testDeleteSubject() { - JSON.loadDemoData() - - guard let subject = Util.getAllSubjects().randomElement() else { - return assertionFailure("No Subject") - } - Util.deleteSubject(subject) - XCTAssertTrue(Util.getAllSubjects().filter { $0.name == subject.name}.isEmpty) - } - - // MARK: GradeTypes - func testGetDefaultTypes() { - let types = Util.getTypes() - XCTAssertEqual(types.count, 2) - XCTAssertEqual(types.filter {$0.name == "Test" || $0.name == "Klausur"}.count, 2) - } - - func testAddType_MoreThen100Percent() { - Util.addType(name: "someName", weigth: 0) - XCTAssertNotNil(Util.getTypes().filter {$0.name == "someName"}) - } - - func testAddType() { - Util.addType(name: "someName", weigth: 200) - XCTAssertNotNil(Util.getTypes().filter {$0.name == "someName"}) - } - - func testDeleteType() { - guard let gradeType = Util.getTypes().first else { - return assertionFailure("No type :c") - } - Util.deleteType(type: gradeType) - XCTAssertTrue(Util.getTypes().filter {$0.name == gradeType.name}.isEmpty) - } - - func testDeleteTypeById() { - guard let gradeType = Util.getTypes().first else { - return assertionFailure("No type :c") - } - Util.deleteType(type: gradeType.id) - XCTAssertTrue(Util.getTypes().filter {$0.name == gradeType.name}.isEmpty) - } - - func testEditTypes() { - // add type - Util.addType(name: "someName", weigth: 0) - let type = Util.getTypes().filter {$0.name == "someName"}[0] - // remove random type - Util.deleteType(type: type.id) - XCTAssertTrue(Util.getTypes().filter {$0.name == "someName"}.isEmpty) - } - - func testGetTypes() { - XCTAssertGreaterThan(Util.getTypes().count, 1) - } - - func testGetTypes_WhenOnly1Exists() { - Util.deleteSettings() - JSON.loadDemoData() - - let type = Util.getTypes().first! - Util.deleteType(type: type) - XCTAssertEqual(Util.getTypes().count, 2) - } - - func testgetTypeGrades() { - XCTAssertNotNil(Util.getTypeGrades(0)) - } - - func testIsPrimaryType() { - JSON.loadDemoData() - let type = Util.getTypes().filter { $0.name == "Klausur"}.first! - XCTAssertTrue(Util.isPrimaryType(type)) - } - - // MARK: idk random func testGetSubjectAverage() { JSON.loadDemoData() if let sub = Util.getAllSubjects().filter({ $0.name == "Kunst"}).first { @@ -279,12 +144,4 @@ final class CalqTests: XCTestCase { XCTAssertEqual(Util.generalAverage(), 0.0) } - - func testDeleteTest() { - let sub = MockDataProvider.getSubjectWithTests() - XCTAssertEqual(sub.subjecttests?.count, 1) - - Util.deleteTest((sub.subjecttests?.allObjects.first!)! as! UserTest) - XCTAssertEqual(sub.subjecttests?.count, 0) - } } diff --git a/CalqTests/JSONTests.swift b/CalqTests/JSONTests.swift index 0816dd8..f3092de 100644 --- a/CalqTests/JSONTests.swift +++ b/CalqTests/JSONTests.swift @@ -60,4 +60,24 @@ final class JSONTests: XCTestCase { do { try JSON.importJSONfromDevice(ressourceURL) } catch { return assertionFailure("Failed to load resource") } } + + func testCreateWidgetPreviewData() { + XCTAssertEqual(JSON.createWidgetPreviewData().count, 12) + } + + // MARK: Validation + func testCheckGrade() { + XCTAssertEqual(JSON.checkGrade(3), 3) + XCTAssertEqual(JSON.checkGrade(16), 0) + } + + func testCheckYear() { + XCTAssertEqual(JSON.checkYear(3), 3) + XCTAssertEqual(JSON.checkYear(5), 0) + } + + func testCheckType() { + XCTAssertEqual(JSON.checkType(3), 3) + XCTAssertEqual(JSON.checkType(7), 0) + } } diff --git a/CalqTests/Util/CoreDataTests.swift b/CalqTests/Util/CoreDataTests.swift new file mode 100644 index 0000000..b9982ce --- /dev/null +++ b/CalqTests/Util/CoreDataTests.swift @@ -0,0 +1,34 @@ +// +// CoreDataTests.swift +// CalqTests +// +// Created by Kiara on 13.03.24. +// + +import XCTest +@testable import Calq + +final class CoreDataTests: XCTestCase { + override class func setUp() { + Util.setContext(TestCoreDataStack.sharedContext) + } + + func testDeleteData() { + Util.deleteSettings() + + let count = Util.getAllSubjects().count + XCTAssertEqual(count, 0) + let types = Util.getTypes().count + XCTAssertEqual(types, 2) + } + + func testAverageString() { + let average = Util.averageString(MockDataProvider.getSubjectWithTests()) + XCTAssertEqual(average, "-- 11 -- -- ") + } + + func testAverageString_WithoutTests() { + let average = Util.averageString(MockDataProvider.getSubjectWithoutTests()) + XCTAssertEqual(average, "-- -- -- -- ") + } +} diff --git a/CalqTests/Util/GradeTypeTests.swift b/CalqTests/Util/GradeTypeTests.swift new file mode 100644 index 0000000..1701f0e --- /dev/null +++ b/CalqTests/Util/GradeTypeTests.swift @@ -0,0 +1,92 @@ +// +// GradeTypeTests.swift +// CalqTests +// +// Created by Kiara on 13.03.24. +// + +import XCTest +@testable import Calq + +final class GradeTypeTests: XCTestCase { + + override class func setUp() { + Util.setContext(TestCoreDataStack.sharedContext) + } + + func testGetDefaultTypes() { + JSON.loadDemoData() + let types = Util.getTypes() + XCTAssertEqual(types.count, 2) + XCTAssertEqual(types.filter {$0.name == "Test" || $0.name == "Klausur"}.count, 2) + } + + func testAddType_MoreThen100Percent() { + Util.addType(name: "someName", weigth: 0) + XCTAssertNotNil(Util.getTypes().filter {$0.name == "someName"}) + } + + func testAddType() { + Util.addType(name: "someName", weigth: 200) + XCTAssertNotNil(Util.getTypes().filter {$0.name == "someName"}) + } + + func testDeleteType() { + guard let gradeType = Util.getTypes().first else { + return assertionFailure("No type :c") + } + Util.deleteType(type: gradeType) + XCTAssertTrue(Util.getTypes().filter {$0.name == gradeType.name}.isEmpty) + } + + func testDeleteTypeById() { + guard let gradeType = Util.getTypes().first else { + return assertionFailure("No type :c") + } + Util.deleteType(type: gradeType.id) + XCTAssertTrue(Util.getTypes().filter {$0.name == gradeType.name}.isEmpty) + } + + func testEditTypes() { + JSON.loadDemoData() + // add type + Util.addType(name: "someName", weigth: 0) + let type = Util.getTypes().filter {$0.name == "someName"}[0] + // remove random type + Util.deleteType(type: type.id) + XCTAssertTrue(Util.getTypes().filter {$0.name == "someName"}.isEmpty) + } + + func testGetTypes() { + XCTAssertGreaterThan(Util.getTypes().count, 1) + } + + func testGetTypes_WhenOnly1Exists() { + Util.deleteSettings() + JSON.loadDemoData() + + let type = Util.getTypes().first! + Util.deleteType(type: type) + XCTAssertEqual(Util.getTypes().count, 2) + } + + func testgetTypeGrades() { + XCTAssertNotNil(Util.getTypeGrades(0)) + } + + func testIsPrimaryType() { + JSON.loadDemoData() + let type = Util.getTypes().filter { $0.name == "Klausur"}.first! + XCTAssertTrue(Util.isPrimaryType(type)) + } + + func testGetTypeGrades() { + JSON.loadDemoData() + guard let type = Util.getTypes().filter({ $0.name == "Klausur" }).first else { + return assertionFailure("No Gradetypes") + } + + let result = Util.getTypeGrades(type.id).map {"\($0.grade)"} .joined(separator: ", ") + XCTAssertEqual(result, "11, 10, 8, 12, 13, 11, 4, 13, 10, 10, 10, 10, 2, 9, 10, 12, 14, 8, 14, 11, 14, 14, 10, 15, 13, 13, 15, 7, 10, 9, 11") + } +} diff --git a/CalqTests/Util/SubjectTests.swift b/CalqTests/Util/SubjectTests.swift new file mode 100644 index 0000000..4cda6c9 --- /dev/null +++ b/CalqTests/Util/SubjectTests.swift @@ -0,0 +1,82 @@ +// +// SubjectTests.swift +// CalqTests +// +// Created by Kiara on 13.03.24. +// + +import XCTest +@testable import Calq + +final class SubjectTests: XCTestCase { + override class func setUp() { + Util.setContext(TestCoreDataStack.sharedContext) + } + + func getExampleSub() -> UserSubject { // load demoData before! + return Util.getAllSubjects().first(where: {$0.name == "Kunst"})! + } + + func testDeleteSubject() { + JSON.loadDemoData() + + guard let subject = Util.getAllSubjects().randomElement() else { + return assertionFailure("No Subject") + } + Util.deleteSubject(subject) + XCTAssertTrue(Util.getAllSubjects().filter { $0.name == subject.name}.isEmpty) + } + + func testDeleteTest() { + let sub = MockDataProvider.getSubjectWithTests() + XCTAssertEqual(sub.subjecttests?.count, 1) + + Util.deleteTest((sub.subjecttests?.allObjects.first!)! as! UserTest) + XCTAssertEqual(sub.subjecttests?.count, 0) + } + + // MARK: Inactive Year funcs + func testDeactivateHalfyear() { + JSON.loadDemoData() + + let before = Util.getinactiveYears(getExampleSub()) + XCTAssertEqual(before.count, 0) + + let subject = Util.addYear(getExampleSub(), 3) + let after = Util.getinactiveYears(subject) + + XCTAssertEqual(after.count, 1) + } + + func testAddInactiveHalfyearTwice() { + JSON.loadDemoData() + + Util.addYear(getExampleSub(), 3) + let firstResult = Util.getinactiveYears(getExampleSub()) + XCTAssertEqual(firstResult.count, 1) + + Util.addYear(getExampleSub(), 3) + + let secondResult = Util.getinactiveYears(getExampleSub()) + XCTAssertEqual(secondResult.count, 1) + } + + func testRemoveNotAddedInactiveHalfyear() { + JSON.loadDemoData() + + Util.addYear(getExampleSub(), 3) + let firstResult = Util.getinactiveYears(getExampleSub()) + XCTAssertEqual(firstResult.count, 1) + + Util.removeYear(getExampleSub(), 4) + + let secondResult = Util.getinactiveYears(getExampleSub()) + XCTAssertEqual(secondResult.count, 1) + } + + func testLastActiveYear() { + JSON.loadDemoData() + let lastYear = Util.lastActiveYear(getExampleSub()) + XCTAssertEqual(lastYear, 4) + } +}