Skip to content

Commit a88e05d

Browse files
committed
fix and update mock data tests
1 parent 4754ce2 commit a88e05d

File tree

7 files changed

+813
-133
lines changed

7 files changed

+813
-133
lines changed

Sources/EmealKit/Mensa/MealFeed.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ extension Meal {
1919
}
2020
}
2121

22-
public static func rssData(session: URLSession = .shared) async throws -> [RSSMeal] {
22+
public static func rssData() async throws -> [RSSMeal] {
2323
let feedURL = URL(string: "https://www.studentenwerk-dresden.de/feeds/speiseplan.rss")!
2424
let parser = FeedParser(URL: feedURL)
2525
return try await withCheckedThrowingContinuation { continuation in

Sources/EmealKit/Mensa/MensaAPI.swift

+17-11
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ internal extension URL {
1414
// MARK: - Canteens
1515

1616
extension Canteen {
17-
public static func all(session: URLSession = .shared) async throws(EmealError) -> [Canteen] {
17+
public static func all(session: URLSessionProtocol = URLSession.shared) async throws(EmealError) -> [Canteen] {
1818
Logger.emealKit.debug("Fetching all canteens")
1919
do {
2020
let (data, _) = try await session.data(from: URL.Mensa.canteens)
21+
print(String(data: data, encoding: .utf8)!)
2122
let canteens = try JSONDecoder().decode([Canteen].self, from: data)
2223
Logger.emealKit.debug("Successfully fetched \(canteens.count) canteens")
2324
return canteens
@@ -31,30 +32,35 @@ extension Canteen {
3132
// MARK: - Meals
3233

3334
extension Meal {
34-
public static func `for`(canteen: Int, on date: Date, session: URLSession = .shared) async throws(EmealError) -> [Meal] {
35+
public static func `for`(canteen: Int, on date: Date, session: URLSessionProtocol = URLSession.shared) async throws(EmealError) -> [Meal] {
3536
Logger.emealKit.debug("Fetching meals for canteen \(canteen) on \(date)")
3637
do {
3738
let (data, _) = try await session.data(from: URL.Mensa.meals(canteen: canteen, date: date))
3839
let meals = try JSONDecoder().decode([Meal].self, from: data)
3940
Logger.emealKit.debug("Successfully fetched \(meals.count) meals")
4041

41-
let feedItems = try await Self.rssData()
42-
return meals.map { meal in
43-
var meal = meal
44-
let matchingItem = feedItems.first { $0.matches(meal: meal) }
45-
if let matchingItem {
46-
Logger.emealKit.debug("Found matching feeditem for \(meal.id)")
47-
meal.isSoldOut = matchingItem.isSoldOut
42+
do {
43+
let feedItems = try await Self.rssData()
44+
return meals.map { meal in
45+
var meal = meal
46+
let matchingItem = feedItems.first { $0.matches(meal: meal) }
47+
if let matchingItem {
48+
Logger.emealKit.debug("Found matching feeditem for \(meal.id)")
49+
meal.isSoldOut = matchingItem.isSoldOut
50+
}
51+
return meal
4852
}
49-
return meal
53+
} catch (let error) {
54+
Logger.emealKit.log("Failed to fetch rss data, continuing without: \(String(describing: error))")
55+
return meals
5056
}
5157
} catch (let error) {
5258
Logger.emealKit.error("Failed to fetch meal data: \(String(describing: error))")
5359
throw .other(error)
5460
}
5561
}
5662

57-
public static func `for`(canteen: CanteenId, on date: Date, session: URLSession = .shared) async throws(EmealError) -> [Meal] {
63+
public static func `for`(canteen: CanteenId, on date: Date, session: URLSessionProtocol = URLSession.shared) async throws(EmealError) -> [Meal] {
5864
try await Self.for(canteen: canteen.rawValue, on: date, session: session)
5965
}
6066
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import Foundation
2+
3+
public protocol URLSessionProtocol {
4+
func data(from url: URL) async throws -> (Data, URLResponse)
5+
}
6+
7+
extension URLSession: URLSessionProtocol {
8+
9+
}

Tests/EmealKitTests/CanteenTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import CoreLocation
55
class CanteenTests: XCTestCase {
66
@available(macOS 12.0, iOS 15.0, *)
77
func testMockFetchAndDecode() async throws {
8-
let canteens = try await Canteen.all(session: MockURLSession(mockData: .canteens))
9-
XCTAssertEqual(canteens.count, 21)
8+
let canteens = try await Canteen.all(session: MockURLSession(data: .canteens))
9+
XCTAssertEqual(canteens.count, 16)
1010
}
1111

1212
func testLocation() {

Tests/EmealKitTests/MealTests.swift

+21-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import EmealKit
44
class MealTests: XCTestCase {
55
@available(macOS 12.0, iOS 15.0, *)
66
func testMockFetchAndDecode() async throws {
7-
let meals = try await Meal.for(canteen: .alteMensa, on: Date(), session: MockURLSession(mockData: .meals))
8-
XCTAssertEqual(meals.count, 5)
7+
let meals = try await Meal.for(canteen: .alteMensa, on: Date(), session: MockURLSession(data: .meals))
8+
XCTAssertEqual(meals.count, 4)
99
}
1010

1111
func testPlaceholderImage() {
12-
let meal = Meal(id: 0, name: "", notes: [], prices: nil, category: "",
13-
image: URL(string: "https://static.studentenwerk-dresden.de/bilder/mensen/studentenwerk-dresden-lieber-mensen-gehen.jpg")!,
14-
url: URL(string: "q")!)
12+
let meal = Meal(
13+
id: 0,
14+
name: "",
15+
notes: [],
16+
prices: nil,
17+
category: "",
18+
image: URL(string: "https://static.studentenwerk-dresden.de/bilder/mensen/studentenwerk-dresden-lieber-mensen-gehen.jpg")!,
19+
url: URL(string: "q")!
20+
)
1521
XCTAssert(meal.imageIsPlaceholder)
1622
}
1723

@@ -78,5 +84,15 @@ class MealTests: XCTestCase {
7884
XCTAssertEqual(prices2.students, 1.0)
7985
XCTAssertEqual(prices2.employees, 1.0)
8086
}
87+
88+
func testFeedData() async throws {
89+
// Unfortunately we can't really test this with mock data since there's no way to inject anything into FeedKit.
90+
let feedItems = try await Meal.rssData()
91+
XCTAssertGreaterThan(feedItems.count, 0)
92+
}
93+
94+
func testSoldOut() async throws {
95+
// see above
96+
}
8197
}
8298

0 commit comments

Comments
 (0)