Favourites: drag-and-drop reorder per fuel; stored order drives single-widget favourite

This commit is contained in:
FuelBoard Contributor
2026-08-14 10:48:53 +01:00
parent aa95d214e8
commit fbf8c79feb
5 changed files with 139 additions and 43 deletions
@@ -292,6 +292,40 @@ final class FavouriteRefreshTests: XCTestCase {
}
}
final class FavouriteReorderTests: XCTestCase {
private func entry(_ id: String, _ fuel: FuelType) -> FavouriteEntry {
FavouriteEntry(station: FuelStation(id: id, name: id, brand: "X", address: "", postcode: "", lat: 0, lng: 0, prices: [fuel: 140.0], priceUpdated: nil), fuel: fuel)
}
func testReorderMovesWithinFuelAndKeepsOthersRelativeOrder() {
// e10: a, b, c | diesel: d
let list = [entry("a", .e10), entry("b", .e10), entry("c", .e10), entry("d", .diesel)]
// Move c (index 2) to the front (offset 0) of the e10 list.
let moved = FuelStore.reorderedFavourites(list, fuel: .e10, fromOffsets: [2], toOffset: 0)
XCTAssertEqual(moved.map(\.station.id), ["c", "a", "b", "d"], "c moves to front; diesel stays last")
}
func testReorderPreservesFuelBlockPosition() {
// diesel first block, then e10 block: d, e | a, b, c
let list = [entry("d", .diesel), entry("e", .diesel), entry("a", .e10), entry("b", .e10), entry("c", .e10)]
// Move a (e10 index 0) to the e10 block end (offset 3 within e10).
let moved = FuelStore.reorderedFavourites(list, fuel: .e10, fromOffsets: [0], toOffset: 3)
XCTAssertEqual(moved.map(\.station.id), ["d", "e", "b", "c", "a"], "e10 block stays in place after diesel block")
}
func testReorderFirstBecomesSingleWidgetFavourite() {
let list = [entry("x", .e10), entry("y", .e10), entry("z", .e10)]
let moved = FuelStore.reorderedFavourites(list, fuel: .e10, fromOffsets: [2], toOffset: 0)
XCTAssertEqual(moved.first?.station.id, "z", "first stored favourite = single-widget favourite")
}
func testReorderMultipleFuelsUntouched() {
let list = [entry("a", .e10), entry("b", .e10), entry("d", .diesel), entry("p", .e5)]
let moved = FuelStore.reorderedFavourites(list, fuel: .e10, fromOffsets: [0], toOffset: 2)
XCTAssertEqual(moved.map(\.station.id), ["b", "a", "d", "p"], "e10 reorder leaves other fuels' relative order intact")
}
}
final class AlertsFuelTests: XCTestCase {
func testAlertsFuelRoundTrips() {
FuelStore.saveAlertsFuel(.diesel)