From 4e7cba8680beeb640cd2266bc93cd2ad324ed1cc Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Mon, 12 Jan 2026 10:59:19 +0900 Subject: [PATCH 01/18] =?UTF-8?q?update:=20HouseworkItem=E3=81=AB=E6=89=BF?= =?UTF-8?q?=E8=AA=8D=E3=81=AE=E3=81=9F=E3=82=81=E3=81=AE=E3=83=95=E3=82=A3?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cohabitant/Housework/HouseworkItem.swift | 44 ++++++++++++++++++- .../Housework/HouseworkListStore.swift | 24 ++++++++++ .../Domain/PushNotificationContent.swift | 10 +++++ .../PreviewUtil/HouseworkUtil.swift | 39 ++++++++++++++++ .../HouseworkDetailActionContent.swift | 18 +++----- 5 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 homete/Views/Components/PreviewUtil/HouseworkUtil.swift diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift index e87c6445..6a0fe5fd 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift @@ -10,12 +10,25 @@ import Foundation struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { let id: String + /// 家事の日付情報 let indexedDate: HouseworkIndexedDate + /// 家事のタイトル let title: String + /// 家事ポイント let point: Int + /// 家事ステータス let state: HouseworkState + /// 実行者のユーザID let executorId: String? + /// 実行日時 let executedAt: Date? + /// 確認者のユーザID + let reviewerId: String? + /// 承認日時 + let approvedAt: Date? + /// 確認コメント + let reviewerComment: String? + /// 有効期限 let expiredAt: Date var formattedIndexedDate: String { @@ -33,6 +46,26 @@ struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { state: .pendingApproval, executorId: changer, executedAt: now, + reviewerId: reviewerId, + approvedAt: approvedAt, + reviewerComment: reviewerComment, + expiredAt: expiredAt + ) + } + + func updateApproved(at now: Date, reviewer: String, comment: String) -> Self { + + return .init( + id: id, + indexedDate: indexedDate, + title: title, + point: point, + state: .pendingApproval, + executorId: executorId, + executedAt: executedAt, + reviewerId: reviewer, + approvedAt: now, + reviewerComment: comment, expiredAt: expiredAt ) } @@ -47,6 +80,9 @@ struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { state: .incomplete, executorId: nil, executedAt: nil, + reviewerId: nil, + approvedAt: nil, + reviewerComment: nil, expiredAt: expiredAt ) } @@ -67,7 +103,10 @@ extension HouseworkItem { metaData: DailyHouseworkMetaData, state: HouseworkState = .incomplete, executorId: String? = nil, - executedAt: Date? = nil + executedAt: Date? = nil, + reviewerId: String? = nil, + approvedAt: Date? = nil, + reviewerComment: String? = nil ) { self.init( @@ -78,6 +117,9 @@ extension HouseworkItem { state: state, executorId: executorId, executedAt: executedAt, + reviewerId: reviewerId, + approvedAt: approvedAt, + reviewerComment: reviewerComment, expiredAt: metaData.expiredAt ) } diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift index 193c457b..fb0b551a 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift @@ -100,6 +100,30 @@ final class HouseworkListStore { } } + func approved(target: HouseworkItem, now: Date, reviwer: CohabitantMember, comment: String) async throws { + + let targetIndexedDate = target.indexedDate + let targetId = target.id + + guard let targetItem = items.item(targetId, targetIndexedDate) else { + + preconditionFailure("Not found target item(id: \(targetId), indexedDate: \(targetIndexedDate))") + } + + let updatedItem = targetItem.updateApproved(at: now, reviewer: reviwer.id, comment: comment) + try await houseworkClient.insertOrUpdateItem(updatedItem, cohabitantId) + + Task.detached { + + let notificationContent = PushNotificationContent.approvedMessage( + reviwerName: reviwer.userName, + houseworkTitle: target.title, + comment: comment + ) + try await self.cohabitantPushNotificationClient.send(self.cohabitantId, notificationContent) + } + } + func returnToIncomplete(target: HouseworkItem, now: Date) async throws { let targetIndexedDate = target.indexedDate diff --git a/homete/Model/Domain/PushNotificationContent.swift b/homete/Model/Domain/PushNotificationContent.swift index 847c1dd1..f5f23fc4 100644 --- a/homete/Model/Domain/PushNotificationContent.swift +++ b/homete/Model/Domain/PushNotificationContent.swift @@ -9,3 +9,13 @@ struct PushNotificationContent: Equatable { let title: String let message: String } + +extension PushNotificationContent { + + static func approvedMessage(reviwerName: String, houseworkTitle: String, comment: String) -> Self { + return .init( + title: "\(reviwerName)が「\(houseworkTitle)」を承認しました!", + message: comment + ) + } +} diff --git a/homete/Views/Components/PreviewUtil/HouseworkUtil.swift b/homete/Views/Components/PreviewUtil/HouseworkUtil.swift new file mode 100644 index 00000000..00efe0c0 --- /dev/null +++ b/homete/Views/Components/PreviewUtil/HouseworkUtil.swift @@ -0,0 +1,39 @@ +// +// HouseworkUtil.swift +// homete +// +// Created by Taichi Sato on 2026/01/12. +// + +import Foundation + +extension HouseworkItem { + + static func makeForPreview( + id: String = UUID().uuidString, + title: String = "", + point: Int = 10, + indexedDate: HouseworkIndexedDate = .init(value: "2026/01/01"), + expiredAt: Date = .distantFuture, + state: HouseworkState = .incomplete, + executorId: String? = nil, + executedAt: Date? = nil, + reviewerId: String? = nil, + approvedAt: Date? = nil, + reviewerComment: String? = nil + ) -> Self { + + return .init( + id: id, + title: title, + point: point, + metaData: .init(indexedDate: indexedDate, expiredAt: expiredAt), + state: state, + executorId: executorId, + executedAt: executedAt, + reviewerId: reviewerId, + approvedAt: approvedAt, + reviewerComment: reviewerComment + ) + } +} diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift index d6dd0d1a..574afb9f 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift @@ -131,15 +131,12 @@ private extension HouseworkDetailActionContent { isLoading: .constant(false), commonErrorContent: .constant(.initial), account: .init(id: "dummy", userName: "", fcmToken: nil, cohabitantId: nil), - item: .init( - id: "", - indexedDate: .init(.distantPast), + item: .makeForPreview( title: "洗濯", point: 10, + indexedDate: .init(.distantPast), state: .pendingApproval, - executorId: "dummy", - executedAt: nil, - expiredAt: .distantPast + executorId: "dummy" ) ) .environment(HouseworkListStore()) @@ -150,15 +147,12 @@ private extension HouseworkDetailActionContent { isLoading: .constant(false), commonErrorContent: .constant(.initial), account: .init(id: "dummy", userName: "", fcmToken: nil, cohabitantId: nil), - item: .init( - id: "", - indexedDate: .init(.distantPast), + item: .makeForPreview( title: "洗濯", point: 10, + indexedDate: .init(.distantPast), state: .pendingApproval, - executorId: "", - executedAt: nil, - expiredAt: .distantPast + executorId: "dummy" ) ) .environment(HouseworkListStore()) From 799b07963e4da19b6da04b693728443ef17962bc Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Tue, 13 Jan 2026 21:00:33 +0900 Subject: [PATCH 02/18] =?UTF-8?q?update:=20=E5=AE=B6=E4=BA=8B=E5=AE=8C?= =?UTF-8?q?=E4=BA=86=E5=87=A6=E7=90=86=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Housework/HouseworkListStore.swift | 3 ++- .../HouseworkApprovalView.swift | 27 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift index fb0b551a..3eb1259b 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkListStore.swift @@ -69,6 +69,7 @@ final class HouseworkListStore { Task.detached { + // TODO: PushNotificationContentにファクトリーメソッドを定義する let notificationContent = PushNotificationContent( title: "新しい家事が登録されました", message: newItem.title @@ -100,7 +101,7 @@ final class HouseworkListStore { } } - func approved(target: HouseworkItem, now: Date, reviwer: CohabitantMember, comment: String) async throws { + func approved(target: HouseworkItem, now: Date, reviwer: Account, comment: String) async throws { let targetIndexedDate = target.indexedDate let targetId = target.id diff --git a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift index cf022549..5ba2ac8a 100644 --- a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift +++ b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift @@ -9,7 +9,10 @@ import SwiftUI struct HouseworkApprovalView: View { @Environment(CohabitantStore.self) var cohabitantStore + @Environment(HouseworkListStore.self) var houseworkListStore + @Environment(\.loginContext.account) var account @Environment(\.dismiss) var dismiss + @CommonError var commonError @State var inputMessage = "" @@ -98,7 +101,9 @@ private extension HouseworkApprovalView { func actionButtonContent() -> some View { VStack(spacing: .space16) { Button { - // TODO: 家事を完了にする + Task { + await tappedApproveButton() + } } label: { Text("完了にする") .frame(maxWidth: .infinity) @@ -116,6 +121,26 @@ private extension HouseworkApprovalView { } } +// MARK: プレゼンテーションロジック + +private extension HouseworkApprovalView { + + func tappedApproveButton() async { + + do { + try await houseworkListStore.approved( + target: item, + now: .now, + reviwer: account, + comment: inputMessage + ) + } catch { + + commonError = .init(error: error) + } + } +} + #Preview { HouseworkApprovalView(item: .init( id: "", From c2f8ff7c726cb1529d904a6395d7ef7ff478f1b8 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Wed, 14 Jan 2026 18:10:21 +0900 Subject: [PATCH 03/18] =?UTF-8?q?update:=20=E6=89=BF=E8=AA=8D=E5=AE=8C?= =?UTF-8?q?=E4=BA=86=E3=81=97=E3=81=9F=E3=82=89=E5=AE=B6=E4=BA=8B=E8=A9=B3?= =?UTF-8?q?=E7=B4=B0=E7=94=BB=E9=9D=A2=E3=81=AB=E6=88=BB=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homete/Views/HouseworkApproval/HouseworkApprovalView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift index 5ba2ac8a..9661014b 100644 --- a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift +++ b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift @@ -128,12 +128,14 @@ private extension HouseworkApprovalView { func tappedApproveButton() async { do { + try await houseworkListStore.approved( target: item, now: .now, reviwer: account, comment: inputMessage ) + dismiss() } catch { commonError = .init(error: error) From cfe1dfb897406bd63c23885085357166a34dd6e6 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 12:56:49 +0900 Subject: [PATCH 04/18] hogehoge --- .../Housework/HouseworkListStoreTest.swift | 89 +++++++++++++++++-- 1 file changed, 81 insertions(+), 8 deletions(-) diff --git a/hometeTests/Domain/Housework/HouseworkListStoreTest.swift b/hometeTests/Domain/Housework/HouseworkListStoreTest.swift index 6c0699a1..f644bea7 100644 --- a/hometeTests/Domain/Housework/HouseworkListStoreTest.swift +++ b/hometeTests/Domain/Housework/HouseworkListStoreTest.swift @@ -226,18 +226,18 @@ struct HouseworkListStoreTest { @Test("家事削除時は家事を削除するAPIを実行する") func remove() async throws { - + // Arrange - + let inputHouseworkItem = HouseworkItem.makeForTest(id: 1) - + try await confirmation { confirmation in - + let store = HouseworkListStore( houseworkClient: .init(removeItemHandler: { item, cohabitantId in - + // Assert - + #expect(item == inputHouseworkItem) #expect(cohabitantId == inputCohabitantId) confirmation() @@ -246,10 +246,83 @@ struct HouseworkListStoreTest { items: [.makeForTest(items: [inputHouseworkItem])], cohabitantId: inputCohabitantId ) - + // Act - + try await store.remove(inputHouseworkItem) } } + + @Test("家事を承認すると、承認情報を更新しパートナーに通知を送信する") + func approved() async throws { + + // Arrange + + let inputHouseworkItem = HouseworkItem.makeForTest( + id: 1, + state: .pendingApproval, + executorId: "executorId", + executedAt: .distantPast + ) + let approvedAt = Date() + let inputReviewer = Account( + id: "reviewerId", + userName: "レビュアー", + fcmToken: nil, + cohabitantId: inputCohabitantId + ) + let inputComment = "お疲れ様でした!" + let updatedHouseworkItem = inputHouseworkItem.updateApproved( + at: approvedAt, + reviewer: inputReviewer.id, + comment: inputComment + ) + let expectedNotificationContent = PushNotificationContent.approvedMessage( + reviwerName: inputReviewer.userName, + houseworkTitle: inputHouseworkItem.title, + comment: inputComment + ) + + await confirmation(expectedCount: 2) { confirmation in + + let _: Void = await withCheckedContinuation { continuation in + + let store = HouseworkListStore( + houseworkClient: .init( + insertOrUpdateItemHandler: { item, cohabitantId in + + // Assert + + #expect(item == updatedHouseworkItem) + #expect(cohabitantId == inputCohabitantId) + confirmation() + } + ), + cohabitantPushNotificationClient: .init { id, content in + + // Assert + + #expect(id == inputCohabitantId) + #expect(content == expectedNotificationContent) + confirmation() + continuation.resume() + }, + items: [.makeForTest(items: [inputHouseworkItem])], + cohabitantId: inputCohabitantId + ) + + // Act + + Task { + + try await store.approved( + target: inputHouseworkItem, + now: approvedAt, + reviwer: inputReviewer, + comment: inputComment + ) + } + } + } + } } From 6ba64dbec036d4b7396c734934c1932555e3c2c0 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 13:34:26 +0900 Subject: [PATCH 05/18] =?UTF-8?q?update:=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE=E3=82=B3=E3=83=B3=E3=83=91?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hometeTests/TestHelper/HouseworkItemHelper.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hometeTests/TestHelper/HouseworkItemHelper.swift b/hometeTests/TestHelper/HouseworkItemHelper.swift index b09f13bb..0b0ce600 100644 --- a/hometeTests/TestHelper/HouseworkItemHelper.swift +++ b/hometeTests/TestHelper/HouseworkItemHelper.swift @@ -18,6 +18,9 @@ extension HouseworkItem { state: HouseworkState = .incomplete, executorId: String? = nil, executedAt: Date? = nil, + reviewerId: String? = nil, + approvedAt: Date? = nil, + reviewerComment: String? = nil, expiredAt: Date = .now ) -> Self { @@ -29,6 +32,9 @@ extension HouseworkItem { state: state, executorId: executorId, executedAt: executedAt, + reviewerId: reviewerId, + approvedAt: approvedAt, + reviewerComment: reviewerComment, expiredAt: expiredAt ) } @@ -40,6 +46,9 @@ extension HouseworkItem { state: HouseworkState? = nil, executorId: String? = nil, executedAt: Date? = nil, + reviewerId: String? = nil, + approvedAt: Date? = nil, + reviewerComment: String? = nil, expiredAt: Date? = nil ) -> HouseworkItem { @@ -49,6 +58,9 @@ extension HouseworkItem { let inputState = state ?? self.state let inputExecutorId = executorId let inputExecutedAt = executedAt + let inputReviewerId = reviewerId + let inputApprovedAt = approvedAt + let inputReviewerComment = reviewerComment let inputExpiredAt = expiredAt ?? self.expiredAt return .init( @@ -59,6 +71,9 @@ extension HouseworkItem { state: inputState, executorId: inputExecutorId, executedAt: inputExecutedAt, + reviewerId: inputReviewerId, + approvedAt: inputApprovedAt, + reviewerComment: inputReviewerComment, expiredAt: inputExpiredAt ) } From c96a6c4dcbb340760c6b22dea6e16afd7627ffe7 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 13:45:36 +0900 Subject: [PATCH 06/18] =?UTF-8?q?update:=20=E5=AE=B6=E4=BA=8B=E6=89=BF?= =?UTF-8?q?=E8=AA=8D=E6=99=82=E3=81=AB=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E3=82=92=E5=AE=8C=E4=BA=86=E3=81=AB=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift index 6a0fe5fd..3fc9a047 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift @@ -60,7 +60,7 @@ struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { indexedDate: indexedDate, title: title, point: point, - state: .pendingApproval, + state: .completed, executorId: executorId, executedAt: executedAt, reviewerId: reviewer, From a6ac50f0e900db31befb06c98b881906c363c98a Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 13:55:56 +0900 Subject: [PATCH 07/18] =?UTF-8?q?update:=20=E6=8B=85=E5=BD=93=E8=80=85?= =?UTF-8?q?=E3=81=A8=E5=88=A5=E3=81=AE=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=81=8B=E3=81=A4=E3=81=BE=E3=81=A0=E5=AE=8C=E4=BA=86=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=E5=AE=B6?= =?UTF-8?q?=E4=BA=8B=E3=82=92=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E3=81=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Cohabitant/Housework/HouseworkItem.swift | 12 ++++++------ .../SubViews/HouseworkDetailActionContent.swift | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift index 3fc9a047..76dc04a5 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkItem.swift @@ -36,6 +36,12 @@ struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { return indexedDate.value } + /// レビュー可能かどうか + func canReview(ownUserId: String) -> Bool { + + return executorId != ownUserId && state != .completed + } + func updatePendingApproval(at now: Date, changer: String) -> Self { return .init( @@ -86,12 +92,6 @@ struct HouseworkItem: Identifiable, Equatable, Sendable, Hashable, Codable { expiredAt: expiredAt ) } - - func isApprovable(_ userId: String) -> Bool { - - guard let executorId else { return false } - return executorId != userId - } } extension HouseworkItem { diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift index 574afb9f..3114b94d 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift @@ -23,7 +23,7 @@ struct HouseworkDetailActionContent: View { case .incomplete: requestReviewButton() case .pendingApproval: - if item.isApprovable(account.id) { + if item.canReview(ownUserId: account.id) { approvalButton() } else { From 6694452c63b3f5ce395595345c13c43a05315652 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 14:05:18 +0900 Subject: [PATCH 08/18] =?UTF-8?q?update:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E5=8F=AF=E8=83=BD=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Housework/HouseworkItemTest.swift | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 hometeTests/Domain/Housework/HouseworkItemTest.swift diff --git a/hometeTests/Domain/Housework/HouseworkItemTest.swift b/hometeTests/Domain/Housework/HouseworkItemTest.swift new file mode 100644 index 00000000..ace9b853 --- /dev/null +++ b/hometeTests/Domain/Housework/HouseworkItemTest.swift @@ -0,0 +1,80 @@ +// +// HouseworkItemTest.swift +// hometeTests +// +// Created by 佐藤汰一 on 2025/09/08. +// + +import Foundation +import Testing + +@testable import homete + +enum HouseworkItemTest { + + struct CanReviewCase {} +} + +extension HouseworkItemTest.CanReviewCase { + + @Test( + "担当者が自分以外かつ未完了の場合、レビュー可能", + arguments: [HouseworkState.incomplete, .pendingApproval] + ) + func canReview_notOwnUserAndNotCompleted_returnsTrue(state: HouseworkState) { + + // Arrange + let item = HouseworkItem.makeForTest( + id: 1, + state: state, + executorId: "otherUserId" + ) + + // Act + let result = item.canReview(ownUserId: "ownUserId") + + // Assert + #expect(result == true) + } + + @Test( + "担当者が自分以外でも完了済みの場合、レビュー不可", + arguments: ["otherUserId", nil] + ) + func canReview_completedState_returnsFalse(executorId: String?) { + + // Arrange + let item = HouseworkItem.makeForTest( + id: 1, + state: .completed, + executorId: executorId + ) + + // Act + let result = item.canReview(ownUserId: "ownUserId") + + // Assert + #expect(result == false) + } + + @Test( + "担当者が自分の場合、未完了でもレビュー不可", + arguments: HouseworkState.allCases + ) + func canReview_ownUser_returnsFalse(state: HouseworkState) { + + // Arrange + let ownUserId = "ownUserId" + let item = HouseworkItem.makeForTest( + id: 1, + state: state, + executorId: ownUserId + ) + + // Act + let result = item.canReview(ownUserId: ownUserId) + + // Assert + #expect(result == false) + } +} From ab13c6d94b314dbd23c2207251f573388f259fe9 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 14:24:24 +0900 Subject: [PATCH 09/18] =?UTF-8?q?update:=20=E5=AE=B6=E4=BA=8B=E3=81=AE?= =?UTF-8?q?=E7=8A=B6=E6=85=8B=E6=9B=B4=E6=96=B0=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Housework/HouseworkItemTest.swift | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/hometeTests/Domain/Housework/HouseworkItemTest.swift b/hometeTests/Domain/Housework/HouseworkItemTest.swift index ace9b853..4ec1eb20 100644 --- a/hometeTests/Domain/Housework/HouseworkItemTest.swift +++ b/hometeTests/Domain/Housework/HouseworkItemTest.swift @@ -13,6 +13,7 @@ import Testing enum HouseworkItemTest { struct CanReviewCase {} + struct UpdateStateCase {} } extension HouseworkItemTest.CanReviewCase { @@ -78,3 +79,119 @@ extension HouseworkItemTest.CanReviewCase { #expect(result == false) } } + +// MARK: - UpdateStateCase + +extension HouseworkItemTest.UpdateStateCase { + + @Test("承認待ち状態に更新すると、state・executorId・executedAtが更新される") + func updatePendingApproval_updatesStateAndExecutorInfo() { + + // Arrange + let indexedDate = Date() + let expiredAt = Date().addingTimeInterval(3600) + let item = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .incomplete, + expiredAt: expiredAt + ) + let now = Date() + let changerId = "changerId" + + // Act + let result = item.updatePendingApproval(at: now, changer: changerId) + + // Assert + let expected = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .pendingApproval, + executorId: changerId, + executedAt: now, + expiredAt: expiredAt + ) + #expect(result == expected) + } + + @Test("承認すると、state・reviewerId・approvedAt・reviewerCommentが更新される") + func updateApproved_updatesStateAndReviewerInfo() { + + // Arrange + let indexedDate = Date() + let expiredAt = Date().addingTimeInterval(3600) + let executorId = "executorId" + let executedAt = Date().addingTimeInterval(-3600) + let item = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .pendingApproval, + executorId: executorId, + executedAt: executedAt, + expiredAt: expiredAt + ) + let now = Date() + let reviewerId = "reviewerId" + let comment = "よくできました" + + // Act + let result = item.updateApproved(at: now, reviewer: reviewerId, comment: comment) + + // Assert + let expected = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .completed, + executorId: executorId, + executedAt: executedAt, + reviewerId: reviewerId, + approvedAt: now, + reviewerComment: comment, + expiredAt: expiredAt + ) + #expect(result == expected) + } + + @Test("未完了状態に戻すと、stateがincompleteになり実行者・承認者情報がクリアされる") + func updateIncomplete_clearsExecutorAndReviewerInfo() { + + // Arrange + let indexedDate = Date() + let expiredAt = Date().addingTimeInterval(3600) + let item = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .completed, + executorId: "executorId", + executedAt: Date(), + reviewerId: "reviewerId", + approvedAt: Date(), + reviewerComment: "コメント", + expiredAt: expiredAt + ) + + // Act + let result = item.updateIncomplete() + + // Assert + let expected = HouseworkItem.makeForTest( + id: 1, + indexedDate: indexedDate, + title: "洗濯", + point: 100, + state: .incomplete, + expiredAt: expiredAt + ) + #expect(result == expected) + } +} From a1a4b92a8f1729491b6cf0665be98d288ec13e2b Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 15:32:20 +0900 Subject: [PATCH 10/18] =?UTF-8?q?update:=20=E5=AE=B6=E4=BA=8B=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E7=9B=A3=E8=A6=96=E6=9C=9F=E9=96=93=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=B1=E3=83=BC=E3=82=B9=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/Dependencies/HouseworkClient.swift | 25 +------- .../Housework/HouseworkIndexedDate.swift | 21 +++++++ .../Housework/HouseworkIndexedDate.swift | 61 ++++++++++++++++++- 3 files changed, 82 insertions(+), 25 deletions(-) diff --git a/homete/Model/Dependencies/HouseworkClient.swift b/homete/Model/Dependencies/HouseworkClient.swift index 12384a1e..30f20ecc 100644 --- a/homete/Model/Dependencies/HouseworkClient.swift +++ b/homete/Model/Dependencies/HouseworkClient.swift @@ -64,7 +64,7 @@ extension HouseworkClient: DependencyClient { } } snapshotListener: { id, cohabitantId, anchorDate, offset in - let targetDateList = calcTargetPeriod( + let targetDateList = HouseworkIndexedDate.calcTargetPeriod( anchorDate: anchorDate, offsetDays: offset, calendar: Calendar.autoupdatingCurrent, @@ -83,26 +83,3 @@ extension HouseworkClient: DependencyClient { static let previewValue = HouseworkClient() } - -private extension HouseworkClient { - - static func calcTargetPeriod( - anchorDate: Date, - offsetDays: Int, - calendar: Calendar, - locale: Locale - ) -> [[String: String]] { - - let base = calendar.startOfDay(for: anchorDate) - guard offsetDays >= 0 else { - - return [["value": HouseworkIndexedDate(base, locale: locale).value]] - } - // -offset ... +offset の範囲を列挙 - return (-offsetDays...offsetDays).compactMap { delta in - - guard let date = calendar.date(byAdding: .day, value: delta, to: base) else { return nil } - return ["value": HouseworkIndexedDate(base, locale: locale).value] - } - } -} diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift index d2f66ad0..bf83c223 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift @@ -8,7 +8,28 @@ import Foundation struct HouseworkIndexedDate: Equatable, Codable, Hashable { + let value: String + + static func calcTargetPeriod( + anchorDate: Date, + offsetDays: Int, + calendar: Calendar, + locale: Locale + ) -> [[String: String]] { + + let base = calendar.startOfDay(for: anchorDate) + guard offsetDays >= 0 else { + + return [["value": HouseworkIndexedDate(base, locale: locale).value]] + } + // -offset ... +offset の範囲を列挙 + return (-offsetDays...offsetDays).compactMap { delta in + + guard let date = calendar.date(byAdding: .day, value: delta, to: base) else { return nil } + return ["value": HouseworkIndexedDate(date, locale: locale).value] + } + } } extension HouseworkIndexedDate { diff --git a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift index c7bc9416..0ff7836f 100644 --- a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift +++ b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift @@ -9,7 +9,15 @@ import Foundation import Testing @testable import homete -struct HouseworkIndexedDateTest { +enum HouseworkIndexedDateTest { + + struct InitCase {} + struct CalcTargetPeriodCase {} +} + +// MARK: - InitCase + +extension HouseworkIndexedDateTest.InitCase { @Test(arguments: [ Date.distantPast, @@ -30,3 +38,54 @@ struct HouseworkIndexedDateTest { #expect(indexedDate.value == expected) } } + +// MARK: - CalcTargetPeriodCase + +extension HouseworkIndexedDateTest.CalcTargetPeriodCase { + + @Test("指定の日付から指定の期間の日付情報を返す") + func calcTargetPeriod() { + + // Arrange + let calendar = Calendar(identifier: .gregorian) + let locale = Locale(identifier: "ja_JP") + + // Act + let result = HouseworkIndexedDate.calcTargetPeriod( + anchorDate: .dateComponents(year: 2026, month: 2, day: 1), + offsetDays: 2, + calendar: calendar, + locale: locale + ) + + // Assert + let expected = [ + ["value": "2026/01/30"], + ["value": "2026/01/31"], + ["value": "2026/02/01"], + ["value": "2026/02/02"], + ["value": "2026/02/03"] + ] + #expect(result == expected) + } + + @Test("指定の期間が0以下の場合、基準日付のみ返す") + func calcTargetPeriod_zero_offset() { + + // Arrange + let calendar = Calendar(identifier: .gregorian) + let locale = Locale(identifier: "ja_JP") + + // Act + let result = HouseworkIndexedDate.calcTargetPeriod( + anchorDate: .dateComponents(year: 2026, month: 1, day: 15), + offsetDays: 0, + calendar: calendar, + locale: locale + ) + + // Assert + let expected = [["value": "2026/01/15"]] + #expect(result == expected) + } +} From da12b326516c4bca70a6543d012d8971ddaacd47 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 15:44:13 +0900 Subject: [PATCH 11/18] =?UTF-8?q?update:=20=E5=AE=B6=E4=BA=8B=E8=A9=B3?= =?UTF-8?q?=E7=B4=B0=E7=94=BB=E9=9D=A2=E3=81=AE=E7=A2=BA=E8=AA=8D=E4=BE=9D?= =?UTF-8?q?=E9=A0=BC=E4=B8=AD=E3=81=8B=E3=81=A4=E7=A2=BA=E8=AA=8D=E8=80=85?= =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88=E3=81=AEPreview?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=9F=E3=83=AD=E3=82=B8?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E5=8F=8D=E6=98=A0=E3=81=95=E3=81=9B?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E5=85=A5=E5=8A=9B=E5=80=A4=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homete/Views/HouseworkApproval/HouseworkApprovalView.swift | 1 + .../SubViews/HouseworkDetailActionContent.swift | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift index 9661014b..c17f7dd1 100644 --- a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift +++ b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift @@ -157,4 +157,5 @@ private extension HouseworkApprovalView { )) .setupEnvironmentForPreview() .environment(CohabitantStore(members: .init(value: [.init(id: "test", userName: "hogehoge")]))) + .environment(HouseworkListStore()) } diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift index 3114b94d..b727fb08 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift @@ -146,13 +146,13 @@ private extension HouseworkDetailActionContent { HouseworkDetailActionContent( isLoading: .constant(false), commonErrorContent: .constant(.initial), - account: .init(id: "dummy", userName: "", fcmToken: nil, cohabitantId: nil), + account: .init(id: "ownAccount", userName: "", fcmToken: nil, cohabitantId: nil), item: .makeForPreview( title: "洗濯", point: 10, indexedDate: .init(.distantPast), state: .pendingApproval, - executorId: "dummy" + executorId: "executorAccount" ) ) .environment(HouseworkListStore()) From 5058384b84a5b7027930c0fbe91c3daf6eb370f7 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 17 Jan 2026 16:01:07 +0900 Subject: [PATCH 12/18] =?UTF-8?q?fix:=20TimeZone=E3=82=92=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E3=81=AB=E3=81=97=E3=81=A6=E7=92=B0=E5=A2=83=E5=B7=AE?= =?UTF-8?q?=E5=88=86=E3=81=AEFlaky=E3=81=AA=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Housework/HouseworkIndexedDate.swift | 10 ++++------ hometeTests/TestHelper/CalendarHelper.swift | 17 +++++++++++++++++ hometeTests/TestHelper/TimeZoneHelper.swift | 12 ++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 hometeTests/TestHelper/CalendarHelper.swift create mode 100644 hometeTests/TestHelper/TimeZoneHelper.swift diff --git a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift index 0ff7836f..0d4f8db1 100644 --- a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift +++ b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift @@ -47,15 +47,14 @@ extension HouseworkIndexedDateTest.CalcTargetPeriodCase { func calcTargetPeriod() { // Arrange - let calendar = Calendar(identifier: .gregorian) - let locale = Locale(identifier: "ja_JP") + let calendar = Calendar.japanese // Act let result = HouseworkIndexedDate.calcTargetPeriod( anchorDate: .dateComponents(year: 2026, month: 2, day: 1), offsetDays: 2, calendar: calendar, - locale: locale + locale: .jp ) // Assert @@ -73,15 +72,14 @@ extension HouseworkIndexedDateTest.CalcTargetPeriodCase { func calcTargetPeriod_zero_offset() { // Arrange - let calendar = Calendar(identifier: .gregorian) - let locale = Locale(identifier: "ja_JP") + let calendar = Calendar.japanese // Act let result = HouseworkIndexedDate.calcTargetPeriod( anchorDate: .dateComponents(year: 2026, month: 1, day: 15), offsetDays: 0, calendar: calendar, - locale: locale + locale: .jp ) // Assert diff --git a/hometeTests/TestHelper/CalendarHelper.swift b/hometeTests/TestHelper/CalendarHelper.swift new file mode 100644 index 00000000..fca998a6 --- /dev/null +++ b/hometeTests/TestHelper/CalendarHelper.swift @@ -0,0 +1,17 @@ +// +// CalendarHelper.swift +// homete +// +// Created by Taichi Sato on 2026/01/17. +// + +import Foundation + +extension Calendar { + static var japanese: Self { + var calendar = Calendar(identifier: .gregorian) + calendar.timeZone = .tokyo + calendar.locale = .jp + return calendar + } +} diff --git a/hometeTests/TestHelper/TimeZoneHelper.swift b/hometeTests/TestHelper/TimeZoneHelper.swift new file mode 100644 index 00000000..98a1450f --- /dev/null +++ b/hometeTests/TestHelper/TimeZoneHelper.swift @@ -0,0 +1,12 @@ +// +// TimeZoneHelper.swift +// homete +// +// Created by Taichi Sato on 2026/01/17. +// + +import Foundation + +extension TimeZone { + static let tokyo = Self.init(identifier: "Asia/Tokyo")! +} From a23a076297160d262bbae6eb5f092205889f9bda Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 24 Jan 2026 16:44:54 +0900 Subject: [PATCH 13/18] =?UTF-8?q?fix:=20=E5=AE=B6=E4=BA=8B=E6=97=A5?= =?UTF-8?q?=E4=BB=98=E8=A8=88=E7=AE=97=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=81=A7=E7=9B=B4=E6=8E=A5TimeZone=E3=82=92=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=A8=E3=81=93=E3=82=8D?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/Dependencies/HouseworkClient.swift | 3 +-- .../Housework/DailyHouseworkList.swift | 5 ++-- .../Housework/DailyHouseworkMetaData.swift | 4 ++-- .../Housework/HouseworkBoardList.swift | 4 ++-- .../Housework/HouseworkIndexedDate.swift | 23 ++++++++----------- .../HouseworkItemPropertyListContent.swift | 2 +- .../HouseworkApprovalView.swift | 2 +- .../HouseworkBoardView.swift | 10 ++++---- .../SubViews/HouseBoardListRow.swift | 2 +- .../SubViews/HouseworkBoardListContent.swift | 21 ++++++++++++++--- .../HouseworkDetailView.swift | 4 ++-- .../HouseworkDetailActionContent.swift | 6 ++--- .../HouseworkDetailItemListContent.swift | 4 ++-- .../RegisterHouseworkView.swift | 4 ++-- .../Housework/DailyHouseworkListTest.swift | 9 ++++---- .../Housework/HouseworkBoardListTest.swift | 4 ++-- .../Housework/HouseworkIndexedDate.swift | 8 +++---- .../Housework/HouseworkListStoreTest.swift | 9 +++++++- .../TestHelper/HouseworkItemHelper.swift | 2 +- hometeTests/TestHelper/TimeZoneHelper.swift | 1 + 20 files changed, 69 insertions(+), 58 deletions(-) diff --git a/homete/Model/Dependencies/HouseworkClient.swift b/homete/Model/Dependencies/HouseworkClient.swift index 30f20ecc..af3f77d1 100644 --- a/homete/Model/Dependencies/HouseworkClient.swift +++ b/homete/Model/Dependencies/HouseworkClient.swift @@ -67,8 +67,7 @@ extension HouseworkClient: DependencyClient { let targetDateList = HouseworkIndexedDate.calcTargetPeriod( anchorDate: anchorDate, offsetDays: offset, - calendar: Calendar.autoupdatingCurrent, - locale: .current + calendar: .autoupdatingCurrent ) return await FirestoreService.shared.addSnapshotListener(id: id) { diff --git a/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkList.swift b/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkList.swift index 419cb7b5..c4a5d194 100644 --- a/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkList.swift +++ b/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkList.swift @@ -15,13 +15,12 @@ struct DailyHouseworkList: Equatable, Sendable { static func makeInitialValue( selectedDate: Date, items: [HouseworkItem], - calendar: Calendar, - locale: Locale + calendar: Calendar ) -> Self { return .init( items: items, - metaData: .init(selectedDate: selectedDate, calendar: calendar, locale: locale) + metaData: .init(selectedDate: selectedDate, calendar: calendar) ) } diff --git a/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkMetaData.swift b/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkMetaData.swift index 6d081d5f..54d59c20 100644 --- a/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkMetaData.swift +++ b/homete/Model/Domain/Cohabitant/Housework/DailyHouseworkMetaData.swift @@ -15,9 +15,9 @@ struct DailyHouseworkMetaData: Equatable { extension DailyHouseworkMetaData { - init(selectedDate: Date, calendar: Calendar, locale: Locale) { + init(selectedDate: Date, calendar: Calendar) { - let indexedDate = HouseworkIndexedDate(selectedDate, locale: locale) + let indexedDate = HouseworkIndexedDate(selectedDate, calendar: calendar) let expiredAt = calendar.date(byAdding: .month, value: 1, to: selectedDate) ?? selectedDate self.init(indexedDate: indexedDate, expiredAt: expiredAt) } diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkBoardList.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkBoardList.swift index 0dcbcf34..abbf5571 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkBoardList.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkBoardList.swift @@ -22,12 +22,12 @@ extension HouseworkBoardList { init( dailyList: [DailyHouseworkList], selectedDate: Date, - locale: Locale + calendar: Calendar ) { items = dailyList .first { - $0.metaData.indexedDate == .init(selectedDate, locale: locale) + $0.metaData.indexedDate == .init(selectedDate, calendar: calendar) }?.items ?? [] } } diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift index bf83c223..4dfdb3c6 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift @@ -14,35 +14,30 @@ struct HouseworkIndexedDate: Equatable, Codable, Hashable { static func calcTargetPeriod( anchorDate: Date, offsetDays: Int, - calendar: Calendar, - locale: Locale + calendar: Calendar ) -> [[String: String]] { let base = calendar.startOfDay(for: anchorDate) guard offsetDays >= 0 else { - return [["value": HouseworkIndexedDate(base, locale: locale).value]] + return [["value": HouseworkIndexedDate(base, calendar: calendar).value]] } // -offset ... +offset の範囲を列挙 return (-offsetDays...offsetDays).compactMap { delta in guard let date = calendar.date(byAdding: .day, value: delta, to: base) else { return nil } - return ["value": HouseworkIndexedDate(date, locale: locale).value] + return ["value": HouseworkIndexedDate(date, calendar: calendar).value] } } } extension HouseworkIndexedDate { - private static let formatStyle = Date.FormatStyle(date: .numeric, time: .omitted) - .year(.extended(minimumLength: 4)) - .month(.twoDigits) - .day(.twoDigits) - - init(_ date: Date, locale: Locale = .init(identifier: "ja_JP")) { - value = date.formatted( - Self.formatStyle - .locale(locale) - ) + init(_ date: Date, calendar: Calendar) { + let formatStyle = Date.FormatStyle(date: .numeric, time: .omitted, calendar: calendar) + .year(.extended(minimumLength: 4)) + .month(.twoDigits) + .day(.twoDigits) + value = date.formatted(formatStyle) } } diff --git a/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift b/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift index 71ef17fa..a43c1b71 100644 --- a/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift +++ b/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift @@ -53,7 +53,7 @@ private extension HouseworkItemPropertyListContent { title: "洗濯", point: 10, metaData: .init( - indexedDate: .init(.init(timeIntervalSince1970: 0)), + indexedDate: .init(value: "2026/1/1"), expiredAt: .init(timeIntervalSince1970: 0) ), executedAt: .distantFuture diff --git a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift index c17f7dd1..52c7e01e 100644 --- a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift +++ b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift @@ -149,7 +149,7 @@ private extension HouseworkApprovalView { title: "洗濯", point: 10, metaData: .init( - indexedDate: .init(.init(timeIntervalSince1970: 0)), + indexedDate: .init(value: "2026/1/1"), expiredAt: .init(timeIntervalSince1970: 0) ), executorId: "test", diff --git a/homete/Views/HouseworkBoardView/HouseworkBoardView.swift b/homete/Views/HouseworkBoardView/HouseworkBoardView.swift index 625b556d..e0ffe5e5 100644 --- a/homete/Views/HouseworkBoardView/HouseworkBoardView.swift +++ b/homete/Views/HouseworkBoardView/HouseworkBoardView.swift @@ -10,7 +10,6 @@ import SwiftUI struct HouseworkBoardView: View { @Environment(\.calendar) var calendar - @Environment(\.locale) var locale @Environment(HouseworkListStore.self) var houseworkListStore @State var navigationPath = AppNavigationPath(path: []) @@ -50,8 +49,7 @@ struct HouseworkBoardView: View { dailyHouseworkList: .makeInitialValue( selectedDate: selectedDate, items: [], - calendar: calendar, - locale: locale + calendar: calendar ) ) } @@ -102,7 +100,7 @@ private extension HouseworkBoardView { houseworkBoardList = .init( dailyList: houseworkListStore.items.value, selectedDate: selectedDate, - locale: locale + calendar: calendar ) } } @@ -123,13 +121,13 @@ private extension HouseworkBoardView { title: "洗濯", point: 20, metaData: .init( - indexedDate: .init(.distantPast), + indexedDate: .init(value: "2026/1/1"), expiredAt: .distantPast ) ) ], metaData: .init( - indexedDate: .init(.distantPast), + indexedDate: .init(value: "2026/1/1"), expiredAt: .now ) ) diff --git a/homete/Views/HouseworkBoardView/SubViews/HouseBoardListRow.swift b/homete/Views/HouseworkBoardView/SubViews/HouseBoardListRow.swift index b494473f..3e6fac6c 100644 --- a/homete/Views/HouseworkBoardView/SubViews/HouseBoardListRow.swift +++ b/homete/Views/HouseworkBoardView/SubViews/HouseBoardListRow.swift @@ -29,7 +29,7 @@ struct HouseBoardListRow: View { title: "洗濯", point: 20, metaData: .init( - indexedDate: .init(.distantFuture), + indexedDate: .init(value: "2026/1/1"), expiredAt: .distantPast ) ) diff --git a/homete/Views/HouseworkBoardView/SubViews/HouseworkBoardListContent.swift b/homete/Views/HouseworkBoardView/SubViews/HouseworkBoardListContent.swift index d237bcad..a2b67e79 100644 --- a/homete/Views/HouseworkBoardView/SubViews/HouseworkBoardListContent.swift +++ b/homete/Views/HouseworkBoardView/SubViews/HouseworkBoardListContent.swift @@ -77,9 +77,24 @@ private extension HouseworkBoardListContent { ), state: .incomplete, list: .init(items: [ - .init(id: "1", title: "洗濯", point: 20, metaData: .init(indexedDate: .init(.now), expiredAt: .now)), - .init(id: "2", title: "掃除", point: 100, metaData: .init(indexedDate: .init(.now), expiredAt: .now)), - .init(id: "3", title: "料理", point: 1, metaData: .init(indexedDate: .init(.now), expiredAt: .now)) + .init( + id: "1", + title: "洗濯", + point: 20, + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .now) + ), + .init( + id: "2", + title: "掃除", + point: 100, + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .now) + ), + .init( + id: "3", + title: "料理", + point: 1, + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .now) + ) ]) ) } diff --git a/homete/Views/HouseworkDetailView/HouseworkDetailView.swift b/homete/Views/HouseworkDetailView/HouseworkDetailView.swift index 70e69b6e..3b2e7c57 100644 --- a/homete/Views/HouseworkDetailView/HouseworkDetailView.swift +++ b/homete/Views/HouseworkDetailView/HouseworkDetailView.swift @@ -100,7 +100,7 @@ private extension HouseworkDetailView { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(.distantPast), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) ) ) } @@ -116,7 +116,7 @@ private extension HouseworkDetailView { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(.distantPast), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) ) ) } diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift index b727fb08..698c53ee 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailActionContent.swift @@ -120,7 +120,7 @@ private extension HouseworkDetailActionContent { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(.distantPast), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) ) ) .environment(HouseworkListStore()) @@ -134,7 +134,7 @@ private extension HouseworkDetailActionContent { item: .makeForPreview( title: "洗濯", point: 10, - indexedDate: .init(.distantPast), + indexedDate: .init(value: "2026/1/1"), state: .pendingApproval, executorId: "dummy" ) @@ -150,7 +150,7 @@ private extension HouseworkDetailActionContent { item: .makeForPreview( title: "洗濯", point: 10, - indexedDate: .init(.distantPast), + indexedDate: .init(value: "2026/1/1"), state: .pendingApproval, executorId: "executorAccount" ) diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift index c0337e9b..e650af9f 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift @@ -46,7 +46,7 @@ struct HouseworkDetailItemListContent: View { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(.distantPast), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) ) ) } @@ -58,7 +58,7 @@ struct HouseworkDetailItemListContent: View { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(.distantPast), expiredAt: .distantFuture), + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture), executorId: "test", executedAt: .distantPast ) diff --git a/homete/Views/RegisterHouseworkView/RegisterHouseworkView.swift b/homete/Views/RegisterHouseworkView/RegisterHouseworkView.swift index 512080d1..5f1737da 100644 --- a/homete/Views/RegisterHouseworkView/RegisterHouseworkView.swift +++ b/homete/Views/RegisterHouseworkView/RegisterHouseworkView.swift @@ -197,7 +197,7 @@ private extension RegisterHouseworkView { RegisterHouseworkView( dailyHouseworkList: .init( items: [], - metaData: .init(indexedDate: .init(.now), expiredAt: .now) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .now) ) ) .injectAppStorageWithPreview("RegisterHouseworkView") { userDefaults in @@ -218,7 +218,7 @@ private extension RegisterHouseworkView { isLoading: true, dailyHouseworkList: .init( items: [], - metaData: .init(indexedDate: .init(.now), expiredAt: .now) + metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .now) ) ) .environment(HouseworkListStore( diff --git a/hometeTests/Domain/Housework/DailyHouseworkListTest.swift b/hometeTests/Domain/Housework/DailyHouseworkListTest.swift index 7190b2cf..9301f1a7 100644 --- a/hometeTests/Domain/Housework/DailyHouseworkListTest.swift +++ b/hometeTests/Domain/Housework/DailyHouseworkListTest.swift @@ -26,7 +26,7 @@ extension DailyHouseworkListTest.MakeInitialValueCase { // Arrange let calendar = Calendar(identifier: .gregorian) let selectedDate = Date() - let expectedIndexedDate = HouseworkIndexedDate(selectedDate) + let expectedIndexedDate = HouseworkIndexedDate(selectedDate, calendar: .japanese) let expectedExpiredAt = try #require(calendar.date(byAdding: .month, value: 1, to: selectedDate)) let expectedList = DailyHouseworkList( @@ -38,8 +38,7 @@ extension DailyHouseworkListTest.MakeInitialValueCase { let list = DailyHouseworkList.makeInitialValue( selectedDate: selectedDate, items: [], - calendar: calendar, - locale: .jp + calendar: calendar ) // Assert @@ -61,7 +60,7 @@ extension DailyHouseworkListTest.IsRegisteredCase { // Arrange let list = DailyHouseworkList( items: inputItems, - metaData: .init(indexedDate: .init(.now), expiredAt: .now) + metaData: .init(indexedDate: .init(.now, calendar: .japanese), expiredAt: .now) ) // Act @@ -91,7 +90,7 @@ extension DailyHouseworkListTest.IsAlreadyRegisteredCase { ] let list = DailyHouseworkList( items: items, - metaData: .init(indexedDate: .init(.now), expiredAt: .now) + metaData: .init(indexedDate: .init(.now, calendar: .japanese), expiredAt: .now) ) // Act diff --git a/hometeTests/Domain/Housework/HouseworkBoardListTest.swift b/hometeTests/Domain/Housework/HouseworkBoardListTest.swift index 7e499fd3..bda8aede 100644 --- a/hometeTests/Domain/Housework/HouseworkBoardListTest.swift +++ b/hometeTests/Domain/Housework/HouseworkBoardListTest.swift @@ -44,7 +44,7 @@ struct HouseworkBoardListTest { let actual = HouseworkBoardList( dailyList: inputList, selectedDate: selectTime, - locale: .jp + calendar: .japanese ) // Assert @@ -63,7 +63,7 @@ struct HouseworkBoardListTest { let houseworkBoardList = HouseworkBoardList( dailyList: [.makeForTest(items: inputHouseworkItem)], selectedDate: .now, - locale: .jp + calendar: .japanese ) // Act diff --git a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift index 0d4f8db1..542aa851 100644 --- a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift +++ b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift @@ -26,7 +26,7 @@ extension HouseworkIndexedDateTest.InitCase { .distantFuture ]) func init_parse_date(inputDate: Date) async throws { - let indexedDate = HouseworkIndexedDate(inputDate) + let indexedDate = HouseworkIndexedDate(inputDate, calendar: .japanese) let expected = inputDate.formatted( Date.FormatStyle(date: .numeric, time: .omitted) @@ -53,8 +53,7 @@ extension HouseworkIndexedDateTest.CalcTargetPeriodCase { let result = HouseworkIndexedDate.calcTargetPeriod( anchorDate: .dateComponents(year: 2026, month: 2, day: 1), offsetDays: 2, - calendar: calendar, - locale: .jp + calendar: calendar ) // Assert @@ -78,8 +77,7 @@ extension HouseworkIndexedDateTest.CalcTargetPeriodCase { let result = HouseworkIndexedDate.calcTargetPeriod( anchorDate: .dateComponents(year: 2026, month: 1, day: 15), offsetDays: 0, - calendar: calendar, - locale: .jp + calendar: calendar ) // Assert diff --git a/hometeTests/Domain/Housework/HouseworkListStoreTest.swift b/hometeTests/Domain/Housework/HouseworkListStoreTest.swift index f644bea7..6d3eb694 100644 --- a/hometeTests/Domain/Housework/HouseworkListStoreTest.swift +++ b/hometeTests/Domain/Housework/HouseworkListStoreTest.swift @@ -65,7 +65,13 @@ struct HouseworkListStoreTest { #expect( store.items == .init(value: [ - .init(items: inputHouseworkList, metaData: .init(indexedDate: .init(.now), expiredAt: now)) + .init( + items: inputHouseworkList, + metaData: .init( + indexedDate: .init(.now, calendar: .japanese), + expiredAt: now + ) + ) ]) ) } @@ -254,6 +260,7 @@ struct HouseworkListStoreTest { } @Test("家事を承認すると、承認情報を更新しパートナーに通知を送信する") + // swiftlint:disable:next function_body_length func approved() async throws { // Arrange diff --git a/hometeTests/TestHelper/HouseworkItemHelper.swift b/hometeTests/TestHelper/HouseworkItemHelper.swift index 0b0ce600..7517c4d3 100644 --- a/hometeTests/TestHelper/HouseworkItemHelper.swift +++ b/hometeTests/TestHelper/HouseworkItemHelper.swift @@ -26,7 +26,7 @@ extension HouseworkItem { return .init( id: "id\(id.formatted())", - indexedDate: .init(indexedDate), + indexedDate: .init(indexedDate, calendar: .japanese), title: title, point: point, state: state, diff --git a/hometeTests/TestHelper/TimeZoneHelper.swift b/hometeTests/TestHelper/TimeZoneHelper.swift index 98a1450f..55f9f65d 100644 --- a/hometeTests/TestHelper/TimeZoneHelper.swift +++ b/hometeTests/TestHelper/TimeZoneHelper.swift @@ -8,5 +8,6 @@ import Foundation extension TimeZone { + // swiftlint:disable:next force_unwrapping static let tokyo = Self.init(identifier: "Asia/Tokyo")! } From a92c043b23c35a0affab06c79b54c711acbcb47c Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 24 Jan 2026 22:03:56 +0900 Subject: [PATCH 14/18] =?UTF-8?q?fix:=20VRT=E3=81=AE=E6=84=8F=E5=9B=B3?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E5=B7=AE=E5=88=86=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/HouseworkItemPropertyListContent.swift | 2 +- homete/Views/HouseworkApproval/HouseworkApprovalView.swift | 2 +- homete/Views/HouseworkBoardView/HouseworkBoardView.swift | 4 ++-- homete/Views/HouseworkDetailView/HouseworkDetailView.swift | 4 ++-- .../SubViews/HouseworkDetailItemListContent.swift | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift b/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift index a43c1b71..5914718b 100644 --- a/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift +++ b/homete/Views/HouseworkApproval/Components/HouseworkItemPropertyListContent.swift @@ -53,7 +53,7 @@ private extension HouseworkItemPropertyListContent { title: "洗濯", point: 10, metaData: .init( - indexedDate: .init(value: "2026/1/1"), + indexedDate: .init(value: "1970/01/01"), expiredAt: .init(timeIntervalSince1970: 0) ), executedAt: .distantFuture diff --git a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift index 52c7e01e..1c85137a 100644 --- a/homete/Views/HouseworkApproval/HouseworkApprovalView.swift +++ b/homete/Views/HouseworkApproval/HouseworkApprovalView.swift @@ -149,7 +149,7 @@ private extension HouseworkApprovalView { title: "洗濯", point: 10, metaData: .init( - indexedDate: .init(value: "2026/1/1"), + indexedDate: .init(value: "1970/01/01"), expiredAt: .init(timeIntervalSince1970: 0) ), executorId: "test", diff --git a/homete/Views/HouseworkBoardView/HouseworkBoardView.swift b/homete/Views/HouseworkBoardView/HouseworkBoardView.swift index e0ffe5e5..27f8d523 100644 --- a/homete/Views/HouseworkBoardView/HouseworkBoardView.swift +++ b/homete/Views/HouseworkBoardView/HouseworkBoardView.swift @@ -121,13 +121,13 @@ private extension HouseworkBoardView { title: "洗濯", point: 20, metaData: .init( - indexedDate: .init(value: "2026/1/1"), + indexedDate: .init(value: "0001/01/01"), expiredAt: .distantPast ) ) ], metaData: .init( - indexedDate: .init(value: "2026/1/1"), + indexedDate: .init(value: "0001/01/01"), expiredAt: .now ) ) diff --git a/homete/Views/HouseworkDetailView/HouseworkDetailView.swift b/homete/Views/HouseworkDetailView/HouseworkDetailView.swift index 1893fcc7..ae628ca3 100644 --- a/homete/Views/HouseworkDetailView/HouseworkDetailView.swift +++ b/homete/Views/HouseworkDetailView/HouseworkDetailView.swift @@ -100,7 +100,7 @@ private extension HouseworkDetailView { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "0001/01/01"), expiredAt: .distantFuture) ) ) } @@ -116,7 +116,7 @@ private extension HouseworkDetailView { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "0001/01/01"), expiredAt: .distantFuture) ) ) } diff --git a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift index e650af9f..2952ee00 100644 --- a/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift +++ b/homete/Views/HouseworkDetailView/SubViews/HouseworkDetailItemListContent.swift @@ -46,7 +46,7 @@ struct HouseworkDetailItemListContent: View { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture) + metaData: .init(indexedDate: .init(value: "0001/01/01"), expiredAt: .distantFuture) ) ) } @@ -58,7 +58,7 @@ struct HouseworkDetailItemListContent: View { id: "", title: "洗濯", point: 10, - metaData: .init(indexedDate: .init(value: "2026/1/1"), expiredAt: .distantFuture), + metaData: .init(indexedDate: .init(value: "0001/01/01"), expiredAt: .distantFuture), executorId: "test", executedAt: .distantPast ) From d156c1bcdce3f76ad6217f8733ca547cc5b3dc8b Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 31 Jan 2026 14:41:57 +0900 Subject: [PATCH 15/18] =?UTF-8?q?CI=E7=92=B0=E5=A2=83=E3=81=AE=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=83=97=E3=83=A9=E3=83=B3=E3=81=ABTimeZone?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CI.xctestplan | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CI.xctestplan b/CI.xctestplan index 1bdf5da1..d3e9b3f6 100644 --- a/CI.xctestplan +++ b/CI.xctestplan @@ -21,7 +21,8 @@ "referenceType" : "built-in" }, "region" : "JP", - "testTimeoutsEnabled" : true + "testTimeoutsEnabled" : true, + "timeZone" : "Asia\/Tokyo" }, "testTargets" : [ { From 98c12993ac5cbcccb4857ce5bb9018b9f4799cd5 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 31 Jan 2026 15:14:49 +0900 Subject: [PATCH 16/18] =?UTF-8?q?TimeZone=E3=82=92HouseworkIndexedDate?= =?UTF-8?q?=E3=81=A7=E6=8C=87=E5=AE=9A=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Cohabitant/Housework/HouseworkIndexedDate.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift index 4dfdb3c6..0d5d9ad3 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift @@ -34,7 +34,12 @@ struct HouseworkIndexedDate: Equatable, Codable, Hashable { extension HouseworkIndexedDate { init(_ date: Date, calendar: Calendar) { - let formatStyle = Date.FormatStyle(date: .numeric, time: .omitted, calendar: calendar) + let formatStyle = Date.FormatStyle( + date: .numeric, + time: .omitted, + calendar: calendar, + timeZone: calendar.timeZone + ) .year(.extended(minimumLength: 4)) .month(.twoDigits) .day(.twoDigits) From 0e815a65b30cdb3e943c574ce6a24c34977cdca1 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 31 Jan 2026 15:34:41 +0900 Subject: [PATCH 17/18] =?UTF-8?q?Locale=E3=82=82=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Domain/Cohabitant/Housework/HouseworkIndexedDate.swift | 1 + hometeTests/Domain/Housework/DailyHouseworkListTest.swift | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift index 0d5d9ad3..89756700 100644 --- a/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift +++ b/homete/Model/Domain/Cohabitant/Housework/HouseworkIndexedDate.swift @@ -37,6 +37,7 @@ extension HouseworkIndexedDate { let formatStyle = Date.FormatStyle( date: .numeric, time: .omitted, + locale: calendar.locale ?? .autoupdatingCurrent, calendar: calendar, timeZone: calendar.timeZone ) diff --git a/hometeTests/Domain/Housework/DailyHouseworkListTest.swift b/hometeTests/Domain/Housework/DailyHouseworkListTest.swift index 9301f1a7..e2e9736a 100644 --- a/hometeTests/Domain/Housework/DailyHouseworkListTest.swift +++ b/hometeTests/Domain/Housework/DailyHouseworkListTest.swift @@ -24,9 +24,9 @@ extension DailyHouseworkListTest.MakeInitialValueCase { func makeInitialValue() throws { // Arrange - let calendar = Calendar(identifier: .gregorian) + let calendar = Calendar.japanese let selectedDate = Date() - let expectedIndexedDate = HouseworkIndexedDate(selectedDate, calendar: .japanese) + let expectedIndexedDate = HouseworkIndexedDate(selectedDate, calendar: calendar) let expectedExpiredAt = try #require(calendar.date(byAdding: .month, value: 1, to: selectedDate)) let expectedList = DailyHouseworkList( From 525711d714c4c567f1795fd0bc1c4ed2029cd2f0 Mon Sep 17 00:00:00 2001 From: stotic-dev Date: Sat, 31 Jan 2026 15:36:28 +0900 Subject: [PATCH 18/18] =?UTF-8?q?InitCase=E3=81=AE=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hometeTests/Domain/Housework/HouseworkIndexedDate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift index 542aa851..c71084b1 100644 --- a/hometeTests/Domain/Housework/HouseworkIndexedDate.swift +++ b/hometeTests/Domain/Housework/HouseworkIndexedDate.swift @@ -29,7 +29,7 @@ extension HouseworkIndexedDateTest.InitCase { let indexedDate = HouseworkIndexedDate(inputDate, calendar: .japanese) let expected = inputDate.formatted( - Date.FormatStyle(date: .numeric, time: .omitted) + Date.FormatStyle(date: .numeric, time: .omitted, calendar: .japanese, timeZone: .tokyo) .year(.extended(minimumLength: 4)) .month(.twoDigits) .day(.twoDigits)