Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
20d95d1
chore: testingDarkMode plan and implementation docs
kangddong May 27, 2026
f7db8d4
chore: add DoriTestSupport module with domain mock factories
kangddong May 27, 2026
9c398af
chore: scaffold snapshot test targets for 4 feature modules
kangddong May 27, 2026
b425341
test: P0 dark-mode snapshot baselines (6 TC × light/dark = 12)
kangddong May 27, 2026
4c62de5
chore: gitignore root-level build/ (stale Xcode DerivedData redirect)
kangddong May 27, 2026
e18aaa2
test: P1 dark-mode snapshot baselines (13 TC × light/dark = 26)
kangddong May 27, 2026
c1ee90f
test: AddDori P2 dark-mode snapshot baselines (7 TC × light/dark = 14)
kangddong Jun 4, 2026
2a82b12
test: Calendar P2 dark-mode snapshot baselines (3 TC × light/dark = 6)
kangddong Jun 4, 2026
c8eff82
test: MyPage P2 dark-mode snapshot baselines (3 TC × light/dark = 6)
kangddong Jun 4, 2026
ba9a719
test: History P2 dark-mode snapshot baselines (14 TC × light/dark = 28)
kangddong Jun 4, 2026
626d901
docs: testingDarkMode Implementation 검증 기록 D2/D3 채움
kangddong Jun 4, 2026
5db6fd9
docs: P2 sweep 1차 발견 결함 기록
kangddong Jun 4, 2026
9107dbd
fix: DoriCommonAlert secondary 버튼 텍스트 다크 토큰 적용
kangddong Jun 4, 2026
71d1693
fix: OnBrand colorset 다크 값 #FFFFFF → #111111 + baseline re-record
kangddong Jun 4, 2026
11c4837
fix: DoriTextField .foregroundStyle(.textPrimary) 명시
kangddong Jun 4, 2026
92402dd
docs: Phase D3 fix 진행 기록 (A 제외, B/C/E 적용, D 보류)
kangddong Jun 5, 2026
87df0f7
fix: 카카오 로그인 버튼 텍스트를 brand-fixed #212223 으로 변경
kangddong Jun 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ playground.xcworkspace
# .swiftpm

.build/
build/
**/Package.resolved

*.xcconfig
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x23",
"green" : "0x22",
"red" : "0x21"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x23",
"green" : "0x22",
"red" : "0x21"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xFF",
"red" : "0xFF"
"blue" : "0x11",
"green" : "0x11",
"red" : "0x11"
}
},
"idiom" : "universal"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public struct DoriCommonAlert: View {
secondaryButton.action()
}
.backgroundColor(.bgSecondary)
.foregroundColor(.black)
.foregroundColor(.textPrimary)
}

PrimaryButton(title: primaryButton.title) {
Expand Down
1 change: 1 addition & 0 deletions Projects/Core/DoriDesignSystem/Sources/DoriTextField.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public struct DoriTextField: View {

TextField(placeholder, text: $localText)
.pretendard(.body(.r3))
.foregroundStyle(.textPrimary)
.padding(.horizontal, 16)
.onChange(of: localText) { _, newValue in
if newValue.count > maxLength {
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
69 changes: 69 additions & 0 deletions Projects/Core/DoriTestSupport/Sources/Mocks/Dori+Mock.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import Foundation
import DoriCore

public extension Dori {
static let mockJudori = Dori(
doriId: 100,
userId: 1,
partnerId: 100,
direction: .judori,
partnerName: "조카 1",
relationship: "가족",
eventType: "생일",
amount: 50_000,
eventDate: "2025-05-01",
isVisited: true,
memo: "",
createdAt: "2026-02-17T09:00:00"
)

static let mockBaddori = Dori(
doriId: 101,
userId: 1,
partnerId: 101,
direction: .baddori,
partnerName: "친구 김철수",
relationship: "친구",
eventType: "결혼식",
amount: 100_000,
eventDate: "2025-08-20",
isVisited: true,
memo: "축의금",
createdAt: "2026-02-20T10:30:00"
)

static let mock = mockJudori

static let mockList: [Dori] = [
.mockJudori,
.mockBaddori,
Dori(
doriId: 102,
userId: 1,
partnerId: 102,
direction: .judori,
partnerName: "사촌 형",
relationship: "가족",
eventType: "돌잔치",
amount: 30_000,
eventDate: "2025-09-15",
isVisited: false,
memo: "",
createdAt: "2026-03-01T14:00:00"
),
Dori(
doriId: 103,
userId: 1,
partnerId: 103,
direction: .baddori,
partnerName: "직장 동료",
relationship: "직장",
eventType: "장례식",
amount: 50_000,
eventDate: "2025-11-03",
isVisited: true,
memo: "",
createdAt: "2026-03-10T09:15:00"
),
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Foundation
import DoriCore

public extension PartnerDoriList {
static let mock = PartnerDoriList(
userId: 1,
partnerId: 100,
partnerName: "조카 1",
relationship: "가족",
inDoriTotalAmount: 80_000,
inDoriList: [.mockJudori],
outDoriTotalAmount: 50_000,
outDoriList: [.mockBaddori]
)

static let mockEmpty = PartnerDoriList(
userId: 1,
partnerId: 999,
partnerName: "이름 없음",
relationship: "기타",
inDoriTotalAmount: 0,
inDoriList: [],
outDoriTotalAmount: 0,
outDoriList: []
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import Foundation
import DoriCore

public extension PartnerSummary {
static let mock = PartnerSummary(
partnerId: 100,
partnerName: "조카 1",
relationship: "가족",
recentDoriList: [.mockJudori],
inDoriTotalAmount: 50_000,
outDoriTotalAmount: 0
)

static let mockList: [PartnerSummary] = [
.mock,
PartnerSummary(
partnerId: 101,
partnerName: "친구 김철수",
relationship: "친구",
recentDoriList: [.mockBaddori],
inDoriTotalAmount: 0,
outDoriTotalAmount: 100_000
),
PartnerSummary(
partnerId: 102,
partnerName: "사촌 형",
relationship: "가족",
recentDoriList: [],
inDoriTotalAmount: 30_000,
outDoriTotalAmount: 0
),
]
}
7 changes: 7 additions & 0 deletions Projects/Core/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ let project = Project.dori(
.external(.snapshotTesting),
]
),
.doriFramework(
DoriModules.testSupport.module,
dependencies: [
DoriModules.core.module.targetDependency,
.external(.composableArchitecture),
]
),
],
resourceSynthesizers: [
.custom(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import ComposableArchitecture
import DoriNetwork
import Testing
@testable import AddDori
@testable import FeatureAddDori

// MARK: - Mock Data

Expand Down
5 changes: 5 additions & 0 deletions Projects/Feature/AddDori/Tests/Placeholder.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import XCTest

/// Placeholder to satisfy Tuist's Tests/** glob.
/// Real snapshot tests live in `Tests/Snapshot/` (Phase D1+).
final class AddDoriTestsPlaceholder: XCTestCase {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import ComposableArchitecture
import DoriCore
import DoriTestSupport
import SnapshotTesting
import SwiftUI
import XCTest

@testable import FeatureAddDori

@MainActor
final class AddDoriPage1SnapshotTests: XCTestCase {
private func makeView(state: AddDoriFeature.State) -> some View {
AddDoriView(
store: Store(initialState: state) {
AddDoriFeature()
}
)
}

// MARK: - Empty search query, no results

private func emptySearchState() -> AddDoriFeature.State {
var state = AddDoriFeature.State()
state.currentPage = 0
state.searchQuery = "박이름"
state.searchResults = []
return state
}

func test_page1_emptySearch_light() {
assertSnapshot(
of: makeView(state: emptySearchState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .light)
)
)
}

func test_page1_emptySearch_dark() {
assertSnapshot(
of: makeView(state: emptySearchState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .dark)
)
)
}

// MARK: - Search results populated

private func searchResultsState() -> AddDoriFeature.State {
var state = AddDoriFeature.State()
state.currentPage = 0
state.searchQuery = "조"
state.searchResults = Dori.mockList
return state
}

func test_page1_searchResults_light() {
assertSnapshot(
of: makeView(state: searchResultsState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .light)
)
)
}

func test_page1_searchResults_dark() {
assertSnapshot(
of: makeView(state: searchResultsState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .dark)
)
)
}

// MARK: - Partner selected

private func selectedPartnerState() -> AddDoriFeature.State {
var state = AddDoriFeature.State()
state.currentPage = 0
state.searchQuery = "조"
state.searchResults = Dori.mockList
state.selectedPartner = Dori.mockList.first
return state
}

func test_page1_selected_light() {
assertSnapshot(
of: makeView(state: selectedPartnerState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .light)
)
)
}

func test_page1_selected_dark() {
assertSnapshot(
of: makeView(state: selectedPartnerState()),
as: .image(
layout: .fixed(width: 393, height: 852),
traits: UITraitCollection(userInterfaceStyle: .dark)
)
)
}
}
Loading