From 7a3c492a7022433721ebd1b538d9fedb31b1c3d4 Mon Sep 17 00:00:00 2001 From: Tim <0xtimc@gmail.com> Date: Mon, 20 Jan 2025 01:03:14 +0000 Subject: [PATCH 1/2] Add test for bug --- .../FluentPostgresDriverTests.swift | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift b/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift index 2501e4a..19ebf6c 100644 --- a/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift +++ b/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift @@ -245,6 +245,47 @@ final class FluentPostgresDriverTests: XCTestCase { try await db.schema(Seq.schema).delete() } + func testSwift6DatePrecisionBug() async throws { + final class Event: Model, @unchecked Sendable { + static let schema = "orgs" + + @ID(custom: "id", generatedBy: .database) var id: Int? + @Field(key: "date") var date: Date + + init() {} + } + + struct CreateEvent: AsyncMigration { + func prepare(on database: any Database) async throws { + try await database.schema("orgs") + .field("id", .int, .identifier(auto: true)) + .field("date", .date, .required) + .create() + } + + func revert(on database: any Database) async throws { + try await database.schema("orgs").delete() + } + } + + try await CreateEvent().prepare(on: self.db) + do { + let date = Date() + let new = Event() + XCTAssertEqual(date, date) + new.date = date + XCTAssertEqual(new.date, date) + try await new.save(on: self.db) + XCTAssertEqual(new.date, date) + let fetched = try await Event.query(on: self.db).first()! + XCTAssertEqual(fetched.date, date) + } catch { + try? await CreateEvent().revert(on: self.db) + throw error + } + try await CreateEvent().revert(on: self.db) + } + var benchmarker: FluentBenchmarker { .init(databases: self.dbs) } var eventLoopGroup: any EventLoopGroup { MultiThreadedEventLoopGroup.singleton } From 0c31c4dc81c49c4b0fedfa50f97a49d8175e6263 Mon Sep 17 00:00:00 2001 From: Tim <0xtimc@gmail.com> Date: Mon, 20 Jan 2025 01:10:30 +0000 Subject: [PATCH 2/2] Numptie --- .../FluentPostgresDriverTests.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift b/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift index 19ebf6c..2923b1c 100644 --- a/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift +++ b/Tests/FluentPostgresDriverTests/FluentPostgresDriverTests.swift @@ -259,7 +259,7 @@ final class FluentPostgresDriverTests: XCTestCase { func prepare(on database: any Database) async throws { try await database.schema("orgs") .field("id", .int, .identifier(auto: true)) - .field("date", .date, .required) + .field("date", .datetime, .required) .create() } @@ -272,13 +272,13 @@ final class FluentPostgresDriverTests: XCTestCase { do { let date = Date() let new = Event() - XCTAssertEqual(date, date) + XCTAssertEqual(date.timeIntervalSince1970, date.timeIntervalSince1970) new.date = date - XCTAssertEqual(new.date, date) + XCTAssertEqual(new.date.timeIntervalSince1970, date.timeIntervalSince1970) try await new.save(on: self.db) - XCTAssertEqual(new.date, date) + XCTAssertEqual(new.date.timeIntervalSince1970, date.timeIntervalSince1970) let fetched = try await Event.query(on: self.db).first()! - XCTAssertEqual(fetched.date, date) + XCTAssertEqual(fetched.date.timeIntervalSince1970, date.timeIntervalSince1970) } catch { try? await CreateEvent().revert(on: self.db) throw error