From cc27c5fca51d5fe180941a620dd3610f68cf9e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 15:00:19 +0900 Subject: [PATCH 01/11] =?UTF-8?q?delete:=20koinUITest=20=ED=83=80=EA=B2=9F?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koin.xcodeproj/project.pbxproj | 125 +----------------- .../xcshareddata/xcschemes/koin.xcscheme | 10 -- koinUITests/koinUITests.swift | 41 ------ koinUITests/koinUITestsLaunchTests.swift | 32 ----- 4 files changed, 5 insertions(+), 203 deletions(-) delete mode 100644 koinUITests/koinUITests.swift delete mode 100644 koinUITests/koinUITestsLaunchTests.swift diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index 29bf32683..a6cdb9d84 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -689,7 +689,7 @@ 835DC2062C84D09400488506 /* FetchRecommendedSearchWordRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835DC2052C84D09400488506 /* FetchRecommendedSearchWordRequest.swift */; }; 836242362BD9522400845499 /* FirebaseLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 836242352BD9522400845499 /* FirebaseLog.swift */; }; 8380FDC32BC1CBB800120036 /* BusCourseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8380FDC22BC1CBB800120036 /* BusCourseDto.swift */; }; - 838F114E2CA51C6C00BF3B25 /* (null) in Sources */ = {isa = PBXBuildFile; }; + 838F114E2CA51C6C00BF3B25 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; 838F11502CA5330900BF3B25 /* AddNoticeKeywordType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838F114F2CA5330900BF3B25 /* AddNoticeKeywordType.swift */; }; 839D71192BEB1570001BC7F7 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 839D71182BEB1570001BC7F7 /* NotificationService.swift */; }; 839D711D2BEB1570001BC7F7 /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 839D71162BEB1570001BC7F7 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -697,7 +697,7 @@ 83B7457D2C9B2EBB005868BD /* IndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B7457C2C9B2EBB005868BD /* IndicatorView.swift */; }; 83BB83132CEC814800946623 /* FetchKeywordNoticePhraseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BB83122CEC814800946623 /* FetchKeywordNoticePhraseUseCase.swift */; }; 83C509622BFA0CBB007379A0 /* ScrollLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83C509612BFA0CBB007379A0 /* ScrollLog.swift */; }; - 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */ = {isa = PBXBuildFile; }; + 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */ = {isa = PBXBuildFile; }; 83DD0D742C4F6FD000278ABD /* BusType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D732C4F6FD000278ABD /* BusType.swift */; }; 83DD0D762C4F6FDE00278ABD /* BusPlace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D752C4F6FDE00278ABD /* BusPlace.swift */; }; 83DD0D782C4F6FF000278ABD /* BusDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D772C4F6FF000278ABD /* BusDirection.swift */; }; @@ -976,7 +976,6 @@ D2FFA98B2D63654A00EF8E56 /* FetchLostItemsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FFA98A2D63654A00EF8E56 /* FetchLostItemsRequest.swift */; }; D80AD4E42E6C6BC30061334B /* waveLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D80AD4E32E6C6BC30061334B /* waveLogo.json */; }; D80AD4E52E6C6BC30061334B /* waveLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D80AD4E32E6C6BC30061334B /* waveLogo.json */; }; - D80AD4E62E6C6BC30061334B /* waveLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D80AD4E32E6C6BC30061334B /* waveLogo.json */; }; D837FB122E254BD8002BFB9F /* CustomSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D837FB112E254BD8002BFB9F /* CustomSessionManager.swift */; }; D85939752DC12C9D00CE4CB2 /* CheckDuplicatedIdUsecase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85939742DC12C9D00CE4CB2 /* CheckDuplicatedIdUsecase.swift */; }; D85939772DC12D0900CE4CB2 /* CheckDuplicatedIdRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85939762DC12D0900CE4CB2 /* CheckDuplicatedIdRequest.swift */; }; @@ -997,7 +996,6 @@ D8B4E0042DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B4E0032DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift */; }; D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */; }; D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; - D8F5C5542E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; D8F5C5552E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; @@ -1019,13 +1017,6 @@ remoteGlobalIDString = A001E2B32845091D00D6C310; remoteInfo = koin; }; - A001E2CF2845091F00D6C310 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A001E2AC2845091D00D6C310 /* Project object */; - proxyType = 1; - remoteGlobalIDString = A001E2B32845091D00D6C310; - remoteInfo = koin; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -1750,9 +1741,6 @@ 83EBB87D2D0FE1BE00346018 /* FetchKoinPickerDateUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchKoinPickerDateUseCase.swift; sourceTree = ""; }; A001E2B42845091D00D6C310 /* koin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = koin.app; sourceTree = BUILT_PRODUCTS_DIR; }; A001E2C42845091F00D6C310 /* koinTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - A001E2CE2845091F00D6C310 /* koinUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - A001E2D22845091F00D6C310 /* koinUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = koinUITests.swift; sourceTree = ""; }; - A001E2D42845091F00D6C310 /* koinUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = koinUITestsLaunchTests.swift; sourceTree = ""; }; B438AEE32E756AB600E889C4 /* OrderImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderImage.swift; sourceTree = ""; }; B46B8CC12E76CB7300A8E797 /* ShopSummaryDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopSummaryDto.swift; sourceTree = ""; }; B46B8CC32E76CC6300A8E797 /* FetchOrderShopSummaryFromShopUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchOrderShopSummaryFromShopUseCase.swift; sourceTree = ""; }; @@ -2065,13 +2053,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2CB2845091F00D6C310 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -4545,7 +4526,6 @@ D27DCD682BA5BADC0081FD36 /* Info.plist */, D2D380E02BA6AC50009AD5A9 /* koin.entitlements */, D27DD0202BA608310081FD36 /* Koin */, - A001E2D12845091F00D6C310 /* koinUITests */, 839D71172BEB1570001BC7F7 /* NotificationService */, 7C7F56B52FFB9F4A00847151 /* Common */, A001E2B52845091D00D6C310 /* Products */, @@ -4557,21 +4537,11 @@ children = ( A001E2B42845091D00D6C310 /* koin.app */, A001E2C42845091F00D6C310 /* koinTests.xctest */, - A001E2CE2845091F00D6C310 /* koinUITests.xctest */, 839D71162BEB1570001BC7F7 /* NotificationService.appex */, ); name = Products; sourceTree = ""; }; - A001E2D12845091F00D6C310 /* koinUITests */ = { - isa = PBXGroup; - children = ( - A001E2D22845091F00D6C310 /* koinUITests.swift */, - A001E2D42845091F00D6C310 /* koinUITestsLaunchTests.swift */, - ); - path = koinUITests; - sourceTree = ""; - }; B46B8D242E770A3100A8E797 /* Fonts */ = { isa = PBXGroup; children = ( @@ -5538,24 +5508,6 @@ productReference = A001E2C42845091F00D6C310 /* koinTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - A001E2CD2845091F00D6C310 /* koinUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = A001E2DE2845091F00D6C310 /* Build configuration list for PBXNativeTarget "koinUITests" */; - buildPhases = ( - A001E2CA2845091F00D6C310 /* Sources */, - A001E2CB2845091F00D6C310 /* Frameworks */, - A001E2CC2845091F00D6C310 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - A001E2D02845091F00D6C310 /* PBXTargetDependency */, - ); - name = koinUITests; - productName = koinUITests; - productReference = A001E2CE2845091F00D6C310 /* koinUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -5612,7 +5564,6 @@ targets = ( A001E2B32845091D00D6C310 /* koin */, A001E2C32845091F00D6C310 /* koinTests */, - A001E2CD2845091F00D6C310 /* koinUITests */, 839D71152BEB1570001BC7F7 /* NotificationService */, ); }; @@ -5637,8 +5588,8 @@ 7CB061D22F32312E00E83CA9 /* DropDownCell.xib in Resources */, B46B8D272E770A3100A8E797 /* Pretendard-Medium.otf in Resources */, D27DD0B22BA608310081FD36 /* Assets.xcassets in Resources */, - 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */, - 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */, + 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */, + 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */, B6A0D62A2EEB01E600A19521 /* Debug.xcconfig in Resources */, D261BBAB2D7B456A00A67F06 /* PrivacyInfo.xcprivacy in Resources */, D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */, @@ -5657,15 +5608,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2CC2845091F00D6C310 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D80AD4E62E6C6BC30061334B /* waveLogo.json in Resources */, - D8F5C5542E6F144300FB6708 /* floatingLogo.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -5746,7 +5688,7 @@ 7CEB3B4B2FBFF4B700AF2B81 /* DeleteDeviceTokenUseCase.swift in Sources */, 7CC42B132F56AB9D00940CE1 /* CallVanListCollectionView.swift in Sources */, D20AB9542C553503006BC684 /* ChangeNotiUseCase.swift in Sources */, - 838F114E2CA51C6C00BF3B25 /* (null) in Sources */, + 838F114E2CA51C6C00BF3B25 /* BuildFile in Sources */, D27DD0CE2BA608310081FD36 /* ViewModelProtocol.swift in Sources */, 7CB2D8B62FDDA7000A9C1234 /* HostingControllerProtocol.swift in Sources */, D2FB23622BFDAC240098BA2B /* ShopAPI.swift in Sources */, @@ -6671,13 +6613,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2CA2845091F00D6C310 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -6691,11 +6626,6 @@ target = A001E2B32845091D00D6C310 /* koin */; targetProxy = A001E2C52845091F00D6C310 /* PBXContainerItemProxy */; }; - A001E2D02845091F00D6C310 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = A001E2B32845091D00D6C310 /* koin */; - targetProxy = A001E2CF2845091F00D6C310 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -6994,42 +6924,6 @@ }; name = Release; }; - A001E2DF2845091F00D6C310 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = K626UYGR25; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "코인(stage)"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = koin; - }; - name = Debug; - }; - A001E2E02845091F00D6C310 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = K626UYGR25; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "코인(stage)"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinUITests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = koin; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -7069,15 +6963,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A001E2DE2845091F00D6C310 /* Build configuration list for PBXNativeTarget "koinUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A001E2DF2845091F00D6C310 /* Debug */, - A001E2E02845091F00D6C310 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme b/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme index 00543f19b..0950ecc44 100644 --- a/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme +++ b/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme @@ -40,16 +40,6 @@ ReferencedContainer = "container:koin.xcodeproj"> - - - - Date: Sat, 8 Aug 2026 15:02:34 +0900 Subject: [PATCH 02/11] =?UTF-8?q?delete:=20=EA=B8=B0=EC=A1=B4=EC=97=90=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EC=96=B4=EC=A7=84=20koinUnitTest=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koin.xcodeproj/project.pbxproj | 107 ------------------ .../xcshareddata/xcschemes/koin.xcscheme | 10 -- 2 files changed, 117 deletions(-) diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index a6cdb9d84..ca17970d4 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -975,7 +975,6 @@ D2FFA9872D63343600EF8E56 /* ReportLostItemUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FFA9862D63343600EF8E56 /* ReportLostItemUseCase.swift */; }; D2FFA98B2D63654A00EF8E56 /* FetchLostItemsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2FFA98A2D63654A00EF8E56 /* FetchLostItemsRequest.swift */; }; D80AD4E42E6C6BC30061334B /* waveLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D80AD4E32E6C6BC30061334B /* waveLogo.json */; }; - D80AD4E52E6C6BC30061334B /* waveLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D80AD4E32E6C6BC30061334B /* waveLogo.json */; }; D837FB122E254BD8002BFB9F /* CustomSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D837FB112E254BD8002BFB9F /* CustomSessionManager.swift */; }; D85939752DC12C9D00CE4CB2 /* CheckDuplicatedIdUsecase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85939742DC12C9D00CE4CB2 /* CheckDuplicatedIdUsecase.swift */; }; D85939772DC12D0900CE4CB2 /* CheckDuplicatedIdRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85939762DC12D0900CE4CB2 /* CheckDuplicatedIdRequest.swift */; }; @@ -996,7 +995,6 @@ D8B4E0042DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8B4E0032DBFAD1A001FBC89 /* CheckVerificationCodeRequest.swift */; }; D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */; }; D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; - D8F5C5552E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; F1A000010000000000000003 /* ZoomingCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */; }; @@ -1010,13 +1008,6 @@ remoteGlobalIDString = 839D71152BEB1570001BC7F7; remoteInfo = NotificationService; }; - A001E2C52845091F00D6C310 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A001E2AC2845091D00D6C310 /* Project object */; - proxyType = 1; - remoteGlobalIDString = A001E2B32845091D00D6C310; - remoteInfo = koin; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -1740,7 +1731,6 @@ 83EBB8792D0FDFD700346018 /* KoinPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KoinPickerView.swift; sourceTree = ""; }; 83EBB87D2D0FE1BE00346018 /* FetchKoinPickerDateUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchKoinPickerDateUseCase.swift; sourceTree = ""; }; A001E2B42845091D00D6C310 /* koin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = koin.app; sourceTree = BUILT_PRODUCTS_DIR; }; - A001E2C42845091F00D6C310 /* koinTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; B438AEE32E756AB600E889C4 /* OrderImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderImage.swift; sourceTree = ""; }; B46B8CC12E76CB7300A8E797 /* ShopSummaryDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopSummaryDto.swift; sourceTree = ""; }; B46B8CC32E76CC6300A8E797 /* FetchOrderShopSummaryFromShopUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchOrderShopSummaryFromShopUseCase.swift; sourceTree = ""; }; @@ -2046,13 +2036,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2C12845091F00D6C310 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -4536,7 +4519,6 @@ isa = PBXGroup; children = ( A001E2B42845091D00D6C310 /* koin.app */, - A001E2C42845091F00D6C310 /* koinTests.xctest */, 839D71162BEB1570001BC7F7 /* NotificationService.appex */, ); name = Products; @@ -5490,24 +5472,6 @@ productReference = A001E2B42845091D00D6C310 /* koin.app */; productType = "com.apple.product-type.application"; }; - A001E2C32845091F00D6C310 /* koinTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = A001E2DB2845091F00D6C310 /* Build configuration list for PBXNativeTarget "koinTests" */; - buildPhases = ( - A001E2C02845091F00D6C310 /* Sources */, - A001E2C12845091F00D6C310 /* Frameworks */, - A001E2C22845091F00D6C310 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - A001E2C62845091F00D6C310 /* PBXTargetDependency */, - ); - name = koinTests; - productName = koinTests; - productReference = A001E2C42845091F00D6C310 /* koinTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -5563,7 +5527,6 @@ projectRoot = ""; targets = ( A001E2B32845091D00D6C310 /* koin */, - A001E2C32845091F00D6C310 /* koinTests */, 839D71152BEB1570001BC7F7 /* NotificationService */, ); }; @@ -5599,15 +5562,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2C22845091F00D6C310 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D80AD4E52E6C6BC30061334B /* waveLogo.json in Resources */, - D8F5C5552E6F144300FB6708 /* floatingLogo.json in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -6606,13 +6560,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A001E2C02845091F00D6C310 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -6621,11 +6568,6 @@ target = 839D71152BEB1570001BC7F7 /* NotificationService */; targetProxy = 839D711B2BEB1570001BC7F7 /* PBXContainerItemProxy */; }; - A001E2C62845091F00D6C310 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = A001E2B32845091D00D6C310 /* koin */; - targetProxy = A001E2C52845091F00D6C310 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -6884,46 +6826,6 @@ }; name = Release; }; - A001E2DC2845091F00D6C310 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = K626UYGR25; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "코인(stage)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/koin.app/koin"; - }; - name = Debug; - }; - A001E2DD2845091F00D6C310 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = K626UYGR25; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "코인(stage)"; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/koin.app/koin"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -6954,15 +6856,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A001E2DB2845091F00D6C310 /* Build configuration list for PBXNativeTarget "koinTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A001E2DC2845091F00D6C310 /* Debug */, - A001E2DD2845091F00D6C310 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme b/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme index 0950ecc44..121e9cc43 100644 --- a/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme +++ b/koin.xcodeproj/xcshareddata/xcschemes/koin.xcscheme @@ -30,16 +30,6 @@ shouldUseLaunchSchemeArgsEnv = "YES" shouldAutocreateTestPlan = "YES"> - - - - Date: Sat, 8 Aug 2026 15:35:25 +0900 Subject: [PATCH 03/11] =?UTF-8?q?add:=20=EC=83=88=EB=A1=9C=EC=9A=B4=20Unit?= =?UTF-8?q?=20Testing=20=ED=83=80=EA=B2=9F=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koin.xcodeproj/project.pbxproj | 150 ++++++++++++++++-- .../xcschemes/NotificationService.xcscheme | 13 ++ .../xcschemes/koin-stage.xcscheme | 13 ++ .../xcshareddata/xcschemes/koin.xcscheme | 11 ++ koinUnitTests/koinUnitTests.swift | 18 +++ 5 files changed, 193 insertions(+), 12 deletions(-) create mode 100644 koinUnitTests/koinUnitTests.swift diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index ca17970d4..a8e885933 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -689,7 +689,7 @@ 835DC2062C84D09400488506 /* FetchRecommendedSearchWordRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835DC2052C84D09400488506 /* FetchRecommendedSearchWordRequest.swift */; }; 836242362BD9522400845499 /* FirebaseLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 836242352BD9522400845499 /* FirebaseLog.swift */; }; 8380FDC32BC1CBB800120036 /* BusCourseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8380FDC22BC1CBB800120036 /* BusCourseDto.swift */; }; - 838F114E2CA51C6C00BF3B25 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + 838F114E2CA51C6C00BF3B25 /* (null) in Sources */ = {isa = PBXBuildFile; }; 838F11502CA5330900BF3B25 /* AddNoticeKeywordType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838F114F2CA5330900BF3B25 /* AddNoticeKeywordType.swift */; }; 839D71192BEB1570001BC7F7 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 839D71182BEB1570001BC7F7 /* NotificationService.swift */; }; 839D711D2BEB1570001BC7F7 /* NotificationService.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 839D71162BEB1570001BC7F7 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -697,7 +697,7 @@ 83B7457D2C9B2EBB005868BD /* IndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B7457C2C9B2EBB005868BD /* IndicatorView.swift */; }; 83BB83132CEC814800946623 /* FetchKeywordNoticePhraseUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BB83122CEC814800946623 /* FetchKeywordNoticePhraseUseCase.swift */; }; 83C509622BFA0CBB007379A0 /* ScrollLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83C509612BFA0CBB007379A0 /* ScrollLog.swift */; }; - 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */ = {isa = PBXBuildFile; }; + 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */ = {isa = PBXBuildFile; }; 83DD0D742C4F6FD000278ABD /* BusType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D732C4F6FD000278ABD /* BusType.swift */; }; 83DD0D762C4F6FDE00278ABD /* BusPlace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D752C4F6FDE00278ABD /* BusPlace.swift */; }; 83DD0D782C4F6FF000278ABD /* BusDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83DD0D772C4F6FF000278ABD /* BusDirection.swift */; }; @@ -996,6 +996,7 @@ D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */; }; D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; + EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC69228E302700E800EE26ED /* koinUnitTests.swift */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; F1A000010000000000000003 /* ZoomingCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */; }; /* End PBXBuildFile section */ @@ -1008,6 +1009,13 @@ remoteGlobalIDString = 839D71152BEB1570001BC7F7; remoteInfo = NotificationService; }; + EC692289302700A400EE26ED /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A001E2AC2845091D00D6C310 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A001E2B32845091D00D6C310; + remoteInfo = koin; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -2001,6 +2009,8 @@ D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderFloatingButton.swift; sourceTree = ""; }; D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieAnimationManageable.swift; sourceTree = ""; }; D8F5C5532E6F144300FB6708 /* floatingLogo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = floatingLogo.json; sourceTree = ""; }; + EC692285302700A400EE26ED /* koinUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + EC69228E302700E800EE26ED /* koinUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = koinUnitTests.swift; sourceTree = ""; }; F1A000010000000000000002 /* ZoomingCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionView.swift; sourceTree = ""; }; F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionViewCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -2036,6 +2046,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EC692282302700A400EE26ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -4511,6 +4528,7 @@ D27DD0202BA608310081FD36 /* Koin */, 839D71172BEB1570001BC7F7 /* NotificationService */, 7C7F56B52FFB9F4A00847151 /* Common */, + EC69228F302700E800EE26ED /* koinUnitTests */, A001E2B52845091D00D6C310 /* Products */, ); sourceTree = ""; @@ -4520,6 +4538,7 @@ children = ( A001E2B42845091D00D6C310 /* koin.app */, 839D71162BEB1570001BC7F7 /* NotificationService.appex */, + EC692285302700A400EE26ED /* koinUnitTests.xctest */, ); name = Products; sourceTree = ""; @@ -5432,6 +5451,14 @@ path = Dining; sourceTree = ""; }; + EC69228F302700E800EE26ED /* koinUnitTests */ = { + isa = PBXGroup; + children = ( + EC69228E302700E800EE26ED /* koinUnitTests.swift */, + ); + path = koinUnitTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -5472,6 +5499,26 @@ productReference = A001E2B42845091D00D6C310 /* koin.app */; productType = "com.apple.product-type.application"; }; + EC692284302700A400EE26ED /* koinUnitTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EC69228D302700A400EE26ED /* Build configuration list for PBXNativeTarget "koinUnitTests" */; + buildPhases = ( + EC692281302700A400EE26ED /* Sources */, + EC692282302700A400EE26ED /* Frameworks */, + EC692283302700A400EE26ED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EC69228A302700A400EE26ED /* PBXTargetDependency */, + ); + name = koinUnitTests; + packageProductDependencies = ( + ); + productName = koinUnitTests; + productReference = EC692285302700A400EE26ED /* koinUnitTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -5479,7 +5526,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1530; + LastSwiftUpdateCheck = 2640; LastUpgradeCheck = 1530; TargetAttributes = { 839D71152BEB1570001BC7F7 = { @@ -5488,12 +5535,8 @@ A001E2B32845091D00D6C310 = { CreatedOnToolsVersion = 13.3.1; }; - A001E2C32845091F00D6C310 = { - CreatedOnToolsVersion = 13.3.1; - TestTargetID = A001E2B32845091D00D6C310; - }; - A001E2CD2845091F00D6C310 = { - CreatedOnToolsVersion = 13.3.1; + EC692284302700A400EE26ED = { + CreatedOnToolsVersion = 26.4.1; TestTargetID = A001E2B32845091D00D6C310; }; }; @@ -5528,6 +5571,7 @@ targets = ( A001E2B32845091D00D6C310 /* koin */, 839D71152BEB1570001BC7F7 /* NotificationService */, + EC692284302700A400EE26ED /* koinUnitTests */, ); }; /* End PBXProject section */ @@ -5551,8 +5595,8 @@ 7CB061D22F32312E00E83CA9 /* DropDownCell.xib in Resources */, B46B8D272E770A3100A8E797 /* Pretendard-Medium.otf in Resources */, D27DD0B22BA608310081FD36 /* Assets.xcassets in Resources */, - 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */, - 83D5E9C82CCB844D00C6D4CD /* BuildFile in Resources */, + 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */, + 83D5E9C82CCB844D00C6D4CD /* (null) in Resources */, B6A0D62A2EEB01E600A19521 /* Debug.xcconfig in Resources */, D261BBAB2D7B456A00A67F06 /* PrivacyInfo.xcprivacy in Resources */, D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */, @@ -5562,6 +5606,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EC692283302700A400EE26ED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -5642,7 +5693,7 @@ 7CEB3B4B2FBFF4B700AF2B81 /* DeleteDeviceTokenUseCase.swift in Sources */, 7CC42B132F56AB9D00940CE1 /* CallVanListCollectionView.swift in Sources */, D20AB9542C553503006BC684 /* ChangeNotiUseCase.swift in Sources */, - 838F114E2CA51C6C00BF3B25 /* BuildFile in Sources */, + 838F114E2CA51C6C00BF3B25 /* (null) in Sources */, D27DD0CE2BA608310081FD36 /* ViewModelProtocol.swift in Sources */, 7CB2D8B62FDDA7000A9C1234 /* HostingControllerProtocol.swift in Sources */, D2FB23622BFDAC240098BA2B /* ShopAPI.swift in Sources */, @@ -6560,6 +6611,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EC692281302700A400EE26ED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -6568,6 +6627,11 @@ target = 839D71152BEB1570001BC7F7 /* NotificationService */; targetProxy = 839D711B2BEB1570001BC7F7 /* PBXContainerItemProxy */; }; + EC69228A302700A400EE26ED /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A001E2B32845091D00D6C310 /* koin */; + targetProxy = EC692289302700A400EE26ED /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -6826,6 +6890,59 @@ }; name = Release; }; + EC69228B302700A400EE26ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = K626UYGR25; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinUnitTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/koin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/koin"; + }; + name = Debug; + }; + EC69228C302700A400EE26ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = K626UYGR25; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.bcsdlab.koinUnitTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/koin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/koin"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -6856,6 +6973,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + EC69228D302700A400EE26ED /* Build configuration list for PBXNativeTarget "koinUnitTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EC69228B302700A400EE26ED /* Debug */, + EC69228C302700A400EE26ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ diff --git a/koin.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme b/koin.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme index 25a323533..023295073 100644 --- a/koin.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme +++ b/koin.xcodeproj/xcshareddata/xcschemes/NotificationService.xcscheme @@ -44,6 +44,19 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" shouldAutocreateTestPlan = "YES"> + + + + + + + + + + + + + + + + Date: Sat, 8 Aug 2026 17:24:19 +0900 Subject: [PATCH 04/11] =?UTF-8?q?add:=20Combine=20Publisher=EB=A5=BC=20asy?= =?UTF-8?q?nc=EB=A1=9C=20=EB=B8=8C=EB=A6=AC=EC=A7=95=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=97=AC=ED=8D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Support/PublisherTestSupport.swift | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 koinUnitTests/Support/PublisherTestSupport.swift diff --git a/koinUnitTests/Support/PublisherTestSupport.swift b/koinUnitTests/Support/PublisherTestSupport.swift new file mode 100644 index 000000000..8dceeb16e --- /dev/null +++ b/koinUnitTests/Support/PublisherTestSupport.swift @@ -0,0 +1,26 @@ +// +// PublisherTestError.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Combine +import Foundation + +enum PublisherTestError: Error { + case finishedWithoutValue +} + +extension Publisher { + /// Combine 파이프라인이 방출하는 첫 번째 값을 async로 받아온다. + /// + /// 프로덕션 코드가 `AnyPublisher`를 반환하기 때문에, Swift Testing의 `async` 테스트에서 + /// `await`로 결과를 기다리기 위해 `Publisher.values`(AsyncSequence)를 경유한다. + func firstValue() async throws -> Output { + for try await value in values { + return value + } + throw PublisherTestError.finishedWithoutValue + } +} From 750b398139e092124b6197d81aa926ad3b83c87d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:42 +0900 Subject: [PATCH 05/11] =?UTF-8?q?add:=20=EC=8B=9D=EB=8B=A8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20Fixture=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koinUnitTests/Support/DiningFixtures.swift | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 koinUnitTests/Support/DiningFixtures.swift diff --git a/koinUnitTests/Support/DiningFixtures.swift b/koinUnitTests/Support/DiningFixtures.swift new file mode 100644 index 000000000..0ceb71d94 --- /dev/null +++ b/koinUnitTests/Support/DiningFixtures.swift @@ -0,0 +1,83 @@ +// +// DiningFixture.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Foundation +@testable import koin + +enum DiningFixture { + + static func dto( + id: Int = 1, + date: String = "2026-08-03", + type: DiningType = .lunch, + place: DiningPlace = .cornerA, + menu: [String]? = ["김치찌개", "밥"], + imageURL: String? = nil + ) -> DiningDto { + DiningDto( + id: id, + date: date, + type: type, + place: place, + priceCard: nil, + priceCash: nil, + kcal: nil, + menu: menu, + createdAt: "", + updatedAt: "", + soldoutAt: nil, + changedAt: nil, + imageURL: imageURL, + likes: 0, + isLiked: false + ) + } + + static func item( + id: Int = 1, + date: String = "2026-08-03", + type: DiningType = .lunch, + place: DiningPlace = .cornerA, + menu: [String] = ["김치찌개", "밥"], + imageUrl: String? = nil + ) -> DiningItem { + DiningItem( + id: id, + type: type, + place: place, + priceCard: nil, + priceCash: nil, + kcal: 0, + menu: menu, + soldoutAt: nil, + changedAt: nil, + imageUrl: imageUrl, + likes: 0, + isLiked: false, + date: date + ) + } + + /// 프로덕션 코드(`DefaultDateProvider`, `Date.formatDateToYYMMDD()`)가 `Calendar.current`와 + /// 기본 `DateFormatter`를 쓰기 때문에, 테스트도 같은 기준으로 Date를 만든다. + static func date( + year: Int = 2026, + month: Int = 8, + day: Int = 3, + hour: Int = 0, + minute: Int = 0, + calendar: Calendar = .current + ) -> Date? { + var components = DateComponents() + components.year = year + components.month = month + components.day = day + components.hour = hour + components.minute = minute + return calendar.date(from: components) + } +} From 6a2e0edd28cc678b02f8c1cfb5a86a6efa8e7d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:47 +0900 Subject: [PATCH 06/11] =?UTF-8?q?add:=20DiningRepository=20Spy=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Doubles/SpyDiningRepository.swift | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 koinUnitTests/Doubles/SpyDiningRepository.swift diff --git a/koinUnitTests/Doubles/SpyDiningRepository.swift b/koinUnitTests/Doubles/SpyDiningRepository.swift new file mode 100644 index 000000000..fff72f6d0 --- /dev/null +++ b/koinUnitTests/Doubles/SpyDiningRepository.swift @@ -0,0 +1,37 @@ +// +// SpyDiningRepository.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Combine +import Foundation +@testable import koin + +/// 호출 여부와 전달된 인자를 기록만 하고, 검증은 테스트 코드에 맡기는 테스트 더블. +final class SpyDiningRepository: DiningRepository { + + /// `fetchDiningList`가 돌려줄 응답. 테스트에서 시나리오별로 갈아끼운다. + var stubbedDiningList: [DiningDto] = [] + + private(set) var fetchDiningListCallCount = 0 + private(set) var receivedFetchRequests: [FetchDiningListRequest] = [] + private(set) var receivedShareModels: [ShareDiningMenu] = [] + + func fetchDiningList(requestModel: FetchDiningListRequest) -> AnyPublisher<[DiningDto], ErrorResponse> { + fetchDiningListCallCount += 1 + receivedFetchRequests.append(requestModel) + return Just(stubbedDiningList) + .setFailureType(to: ErrorResponse.self) + .eraseToAnyPublisher() + } + + func fetchCoopShopList() -> AnyPublisher { + Empty().eraseToAnyPublisher() + } + + func shareMenuList(shareModel: ShareDiningMenu) { + receivedShareModels.append(shareModel) + } +} From bb875237b7aafe911242b58737ab3593d1a1b74f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:49 +0900 Subject: [PATCH 07/11] =?UTF-8?q?add:=20DateProvider=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EB=8C=80=20=ED=8C=90=EB=8B=A8=20=EA=B2=BD=EA=B3=84=EA=B0=92=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koinUnitTests/Dining/DateProviderTests.swift | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 koinUnitTests/Dining/DateProviderTests.swift diff --git a/koinUnitTests/Dining/DateProviderTests.swift b/koinUnitTests/Dining/DateProviderTests.swift new file mode 100644 index 000000000..d354e0f2e --- /dev/null +++ b/koinUnitTests/Dining/DateProviderTests.swift @@ -0,0 +1,81 @@ +// +// DateProviderTests.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Foundation +import Testing +@testable import koin + +@Suite("DateProvider - 시간대 판단 로직 경계값") +struct DateProviderTests { + + private let sut = DefaultDateProvider() + private let calendar = Calendar.current + + private func date(hour: Int, minute: Int) throws -> Date { + try #require(DiningFixture.date(hour: hour, minute: minute, calendar: calendar)) + } + + @Test("09:00 이전이면 breakfast를 반환한다") + func 아홉시_이전이면_breakfast를_반환한다() throws { + let input = try date(hour: 8, minute: 59) + + let result = sut.execute(date: input) + + #expect(result.diningType == .breakfast) + #expect(calendar.isDate(result.date, inSameDayAs: input)) + } + + @Test("09:00이면 lunch를 반환한다") + func 아홉시면_lunch를_반환한다() throws { + let input = try date(hour: 9, minute: 0) + + let result = sut.execute(date: input) + + #expect(result.diningType == .lunch) + #expect(calendar.isDate(result.date, inSameDayAs: input)) + } + + @Test("13:30이면 lunch를 반환한다") + func 열세시_삼십분이면_lunch를_반환한다() throws { + let input = try date(hour: 13, minute: 30) + + let result = sut.execute(date: input) + + #expect(result.diningType == .lunch) + } + + @Test("13:31이면 dinner를 반환한다") + func 열세시_삼십일분이면_dinner를_반환한다() throws { + let input = try date(hour: 13, minute: 31) + + let result = sut.execute(date: input) + + #expect(result.diningType == .dinner) + #expect(calendar.isDate(result.date, inSameDayAs: input)) + } + + @Test("18:30이면 dinner를 반환한다") + func 열여덟시_삼십분이면_dinner를_반환한다() throws { + let input = try date(hour: 18, minute: 30) + + let result = sut.execute(date: input) + + #expect(result.diningType == .dinner) + } + + /// 18:31과 23:59는 "다음 날 breakfast"라는 동일한 결과를 기대하므로 매개변수화한다. + @Test("18:30 이후면 다음 날 breakfast를 반환한다", arguments: [(18, 31), (23, 59)]) + func 열여덟시_삼십분_이후면_다음_날_breakfast를_반환한다(hour: Int, minute: Int) throws { + let input = try date(hour: hour, minute: minute) + let expectedNextDay = try #require(calendar.date(byAdding: .day, value: 1, to: input)) + + let result = sut.execute(date: input) + + #expect(result.diningType == .breakfast) + #expect(calendar.isDate(result.date, inSameDayAs: expectedNextDay)) + } +} From 7f45dcdd7576f62d161df167efb39e5c86820049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:52 +0900 Subject: [PATCH 08/11] =?UTF-8?q?add:=20FetchDiningListUseCase=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EB=A7=81/=EC=A0=95=EB=A0=AC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dining/FetchDiningListUseCaseTests.swift | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 koinUnitTests/Dining/FetchDiningListUseCaseTests.swift diff --git a/koinUnitTests/Dining/FetchDiningListUseCaseTests.swift b/koinUnitTests/Dining/FetchDiningListUseCaseTests.swift new file mode 100644 index 000000000..68dc75446 --- /dev/null +++ b/koinUnitTests/Dining/FetchDiningListUseCaseTests.swift @@ -0,0 +1,88 @@ +// +// FetchDiningListUseCaseTests.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Foundation +import Testing +@testable import koin + +@Suite("FetchDiningListUseCase - segmentControl에 따른 데이터 필터링") +struct FetchDiningListUseCaseTests { + + private func makeSUT( + stubbedDiningList: [DiningDto] + ) -> (sut: DefaultFetchDiningListUseCase, spy: SpyDiningRepository) { + let spy = SpyDiningRepository() + spy.stubbedDiningList = stubbedDiningList + return (DefaultFetchDiningListUseCase(diningRepository: spy), spy) + } + + private func diningInfo( + type: DiningType, + date: Date = Date() + ) -> CurrentDiningTime { + CurrentDiningTime(date: date, diningType: type) + } + + @Test("요청한 시간대의 식단만 반환한다") + func 요청한_시간대의_식단만_반환한다() async throws { + let (sut, _) = makeSUT(stubbedDiningList: [ + DiningFixture.dto(id: 1, type: .breakfast, place: .cornerA), + DiningFixture.dto(id: 2, type: .lunch, place: .cornerB), + DiningFixture.dto(id: 3, type: .dinner, place: .cornerC), + DiningFixture.dto(id: 4, type: .lunch, place: .special) + ]) + + let result = try await sut.execute(diningInfo: diningInfo(type: .lunch)).firstValue() + + #expect(result.count == 2) + #expect(result.allSatisfy { $0.type == .lunch }) + #expect(result.map(\.id).sorted() == [2, 4]) + } + + @Test( + "미운영 메뉴는 제외한다", + arguments: [DiningType.breakfast, .lunch, .dinner] + ) + func 미운영_메뉴는_제외한다(requestedType: DiningType) async throws { + let (sut, _) = makeSUT(stubbedDiningList: [ + DiningFixture.dto(id: 1, type: requestedType, place: .cornerA, menu: ["미운영"]), + DiningFixture.dto(id: 2, type: requestedType, place: .cornerB, menu: ["김치찌개", "밥"]) + ]) + + let result = try await sut.execute(diningInfo: diningInfo(type: requestedType)).firstValue() + + #expect(result.count == 1) + #expect(result.first?.id == 2) + #expect(!result.contains { $0.menu.first == "미운영" }) + } + + @Test("장소 우선순위대로 정렬한다") + func 장소_우선순위대로_정렬한다() async throws { + let (sut, _) = makeSUT(stubbedDiningList: [ + DiningFixture.dto(id: 1, type: .lunch, place: .secondCampus), + DiningFixture.dto(id: 2, type: .lunch, place: .special), + DiningFixture.dto(id: 3, type: .lunch, place: .cornerC), + DiningFixture.dto(id: 4, type: .lunch, place: .cornerA), + DiningFixture.dto(id: 5, type: .lunch, place: .cornerB) + ]) + + let result = try await sut.execute(diningInfo: diningInfo(type: .lunch)).firstValue() + + #expect(result.map(\.place) == [.cornerA, .cornerB, .cornerC, .special, .secondCampus]) + } + + @Test("요청 날짜를 yyMMdd 형식으로 전달한다") + func 요청_날짜를_yyMMdd_형식으로_전달한다() async throws { + let (sut, spy) = makeSUT(stubbedDiningList: []) + let requestedDate = try #require(DiningFixture.date(year: 2026, month: 8, day: 3)) + + _ = try await sut.execute(diningInfo: diningInfo(type: .lunch, date: requestedDate)).firstValue() + + #expect(spy.fetchDiningListCallCount == 1) + #expect(spy.receivedFetchRequests.first?.date == "260803") + } +} From 4d126a021678db2c1c90c84eb1f0407fdc1a0387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:55 +0900 Subject: [PATCH 09/11] =?UTF-8?q?add:=20ShareMenuListUseCase=20=EC=8B=9D?= =?UTF-8?q?=EB=8B=A8=20=EA=B3=B5=EC=9C=A0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dining/ShareMenuListUseCaseTests.swift | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 koinUnitTests/Dining/ShareMenuListUseCaseTests.swift diff --git a/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift b/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift new file mode 100644 index 000000000..c34711075 --- /dev/null +++ b/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift @@ -0,0 +1,84 @@ +// +// ShareMenuListUseCaseTests.swift +// koinUnitTests +// +// Created by 이은지 on 8/8/26. +// + +import Foundation +import Testing +@testable import koin + +@Suite("ShareMenuListUseCase - 카카오톡 식단 공유하기") +struct ShareMenuListUseCaseTests { + + @Test("DiningItem을 ShareDiningMenu로 변환하면 메뉴와 이미지를 유지한다") + func DiningItem을_ShareDiningMenu로_변환하면_메뉴와_이미지를_유지한다() { + let item = DiningFixture.item( + type: .lunch, + place: .cornerA, + menu: ["김치찌개", "밥"], + imageUrl: "url1" + ) + + let shareModel = item.toShareDiningItem() + + #expect(shareModel.menuList == ["김치찌개", "밥"]) + #expect(shareModel.imageUrl == "url1") + #expect(shareModel.type == .lunch) + #expect(shareModel.place == .cornerA) + } + + @Test("날짜를 yyMMdd 형식으로 변환한다") + func 날짜를_yyMMdd_형식으로_변환한다() { + let item = DiningFixture.item(date: "2026-08-03") + + let shareModel = item.toShareDiningItem() + + #expect(shareModel.date == "260803") + } + + /// `DateFormatter`는 구분자가 달라도 관대하게 파싱하기 때문에 "2026/08/03"은 fallback 경로를 타지 않는다. + /// (실제로 "260803"으로 변환된다.) 그래서 파싱이 확실히 실패하는 입력만 검증한다. + @Test( + "날짜 변환에 실패하면 원본 문자열을 사용한다", + arguments: ["", "날짜없음", "2026-13-45"] + ) + func 날짜_변환에_실패하면_원본_문자열을_사용한다(invalidDate: String) { + let item = DiningFixture.item(date: invalidDate) + + let shareModel = item.toShareDiningItem() + + #expect(shareModel.date == invalidDate) + } + + @Test("구분자가 달라도 파싱에 성공하면 yyMMdd로 변환된다") + func 구분자가_달라도_파싱에_성공하면_yyMMdd로_변환된다() { + let item = DiningFixture.item(date: "2026/08/03") + + let shareModel = item.toShareDiningItem() + + #expect(shareModel.date == "260803") + } + + @Test("공유 모델을 레포지토리에 전달한다") + func 공유_모델을_레포지토리에_전달한다() throws { + let spy = SpyDiningRepository() + let sut = DefaultShareMenuListUseCase(diningRepository: spy) + let shareModel = DiningFixture.item( + date: "2026-08-03", + place: .cornerB, + menu: ["돈까스"], + imageUrl: "url2" + ).toShareDiningItem() + + sut.execute(shareModel: shareModel) + + #expect(spy.receivedShareModels.count == 1) + let received = try #require(spy.receivedShareModels.first) + #expect(received.menuList == shareModel.menuList) + #expect(received.imageUrl == shareModel.imageUrl) + #expect(received.date == shareModel.date) + #expect(received.place == shareModel.place) + } +} From 731660548a1446a46c0e4d819da4dd781715e150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:24:59 +0900 Subject: [PATCH 10/11] =?UTF-8?q?chore:=20=EC=8B=9D=EB=8B=A8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20koinUnitTest?= =?UTF-8?q?s=20=ED=83=80=EA=B2=9F=EC=97=90=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koin.xcodeproj/project.pbxproj | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index a8e885933..b4e1701e1 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -997,6 +997,12 @@ D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC69228E302700E800EE26ED /* koinUnitTests.swift */; }; + AA20000000000000000001 /* PublisherTestSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000001 /* PublisherTestSupport.swift */; }; + AA20000000000000000002 /* DiningFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000002 /* DiningFixtures.swift */; }; + AA20000000000000000003 /* SpyDiningRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000003 /* SpyDiningRepository.swift */; }; + AA20000000000000000004 /* DateProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000004 /* DateProviderTests.swift */; }; + AA20000000000000000005 /* FetchDiningListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */; }; + AA20000000000000000006 /* ShareMenuListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; F1A000010000000000000003 /* ZoomingCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */; }; /* End PBXBuildFile section */ @@ -2011,6 +2017,12 @@ D8F5C5532E6F144300FB6708 /* floatingLogo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = floatingLogo.json; sourceTree = ""; }; EC692285302700A400EE26ED /* koinUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; EC69228E302700E800EE26ED /* koinUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = koinUnitTests.swift; sourceTree = ""; }; + AA10000000000000000001 /* PublisherTestSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublisherTestSupport.swift; sourceTree = ""; }; + AA10000000000000000002 /* DiningFixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiningFixtures.swift; sourceTree = ""; }; + AA10000000000000000003 /* SpyDiningRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpyDiningRepository.swift; sourceTree = ""; }; + AA10000000000000000004 /* DateProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateProviderTests.swift; sourceTree = ""; }; + AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchDiningListUseCaseTests.swift; sourceTree = ""; }; + AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareMenuListUseCaseTests.swift; sourceTree = ""; }; F1A000010000000000000002 /* ZoomingCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionView.swift; sourceTree = ""; }; F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionViewCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -5454,11 +5466,41 @@ EC69228F302700E800EE26ED /* koinUnitTests */ = { isa = PBXGroup; children = ( + AA30000000000000000001 /* Support */, + AA30000000000000000002 /* Doubles */, + AA30000000000000000003 /* Dining */, EC69228E302700E800EE26ED /* koinUnitTests.swift */, ); path = koinUnitTests; sourceTree = ""; }; + AA30000000000000000001 /* Support */ = { + isa = PBXGroup; + children = ( + AA10000000000000000001 /* PublisherTestSupport.swift */, + AA10000000000000000002 /* DiningFixtures.swift */, + ); + path = Support; + sourceTree = ""; + }; + AA30000000000000000002 /* Doubles */ = { + isa = PBXGroup; + children = ( + AA10000000000000000003 /* SpyDiningRepository.swift */, + ); + path = Doubles; + sourceTree = ""; + }; + AA30000000000000000003 /* Dining */ = { + isa = PBXGroup; + children = ( + AA10000000000000000004 /* DateProviderTests.swift */, + AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */, + AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */, + ); + path = Dining; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -6616,6 +6658,12 @@ buildActionMask = 2147483647; files = ( EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */, + AA20000000000000000001 /* PublisherTestSupport.swift in Sources */, + AA20000000000000000002 /* DiningFixtures.swift in Sources */, + AA20000000000000000003 /* SpyDiningRepository.swift in Sources */, + AA20000000000000000004 /* DateProviderTests.swift in Sources */, + AA20000000000000000005 /* FetchDiningListUseCaseTests.swift in Sources */, + AA20000000000000000006 /* ShareMenuListUseCaseTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 46433660b9ea59a21d49e2648efbec325a47dc98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9D=80=EC=A7=80?= Date: Sat, 8 Aug 2026 17:26:46 +0900 Subject: [PATCH 11/11] =?UTF-8?q?delete:=20=EB=B9=88=20example()=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- koin.xcodeproj/project.pbxproj | 82 +++++++++---------- koinUnitTests/Dining/DateProviderTests.swift | 1 - .../Dining/ShareMenuListUseCaseTests.swift | 2 - koinUnitTests/koinUnitTests.swift | 18 ---- 4 files changed, 39 insertions(+), 64 deletions(-) delete mode 100644 koinUnitTests/koinUnitTests.swift diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index b4e1701e1..cf61dc458 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -730,6 +730,12 @@ 83E96DB82BBC6FBF00164914 /* BusSearchDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83E96DB72BBC6FBF00164914 /* BusSearchDto.swift */; }; 83EBB87A2D0FDFD700346018 /* KoinPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83EBB8792D0FDFD700346018 /* KoinPickerView.swift */; }; 83EBB87E2D0FE1BE00346018 /* FetchKoinPickerDateUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83EBB87D2D0FE1BE00346018 /* FetchKoinPickerDateUseCase.swift */; }; + AA20000000000000000001 /* PublisherTestSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000001 /* PublisherTestSupport.swift */; }; + AA20000000000000000002 /* DiningFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000002 /* DiningFixtures.swift */; }; + AA20000000000000000003 /* SpyDiningRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000003 /* SpyDiningRepository.swift */; }; + AA20000000000000000004 /* DateProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000004 /* DateProviderTests.swift */; }; + AA20000000000000000005 /* FetchDiningListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */; }; + AA20000000000000000006 /* ShareMenuListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */; }; B438AEE42E756AB600E889C4 /* OrderImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B438AEE32E756AB600E889C4 /* OrderImage.swift */; }; B46B8CC22E76CB7300A8E797 /* ShopSummaryDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = B46B8CC12E76CB7300A8E797 /* ShopSummaryDto.swift */; }; B46B8CC42E76CC6300A8E797 /* FetchOrderShopSummaryFromShopUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B46B8CC32E76CC6300A8E797 /* FetchOrderShopSummaryFromShopUseCase.swift */; }; @@ -996,13 +1002,6 @@ D8F5C54A2E6EF76800FB6708 /* OrderFloatingButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C5492E6EF76800FB6708 /* OrderFloatingButton.swift */; }; D8F5C54C2E6F012500FB6708 /* LottieAnimationManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */; }; D8F5C5562E6F144300FB6708 /* floatingLogo.json in Resources */ = {isa = PBXBuildFile; fileRef = D8F5C5532E6F144300FB6708 /* floatingLogo.json */; }; - EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC69228E302700E800EE26ED /* koinUnitTests.swift */; }; - AA20000000000000000001 /* PublisherTestSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000001 /* PublisherTestSupport.swift */; }; - AA20000000000000000002 /* DiningFixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000002 /* DiningFixtures.swift */; }; - AA20000000000000000003 /* SpyDiningRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000003 /* SpyDiningRepository.swift */; }; - AA20000000000000000004 /* DateProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000004 /* DateProviderTests.swift */; }; - AA20000000000000000005 /* FetchDiningListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */; }; - AA20000000000000000006 /* ShareMenuListUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */; }; F1A000010000000000000001 /* ZoomingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000002 /* ZoomingCollectionView.swift */; }; F1A000010000000000000003 /* ZoomingCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */; }; /* End PBXBuildFile section */ @@ -1745,6 +1744,12 @@ 83EBB8792D0FDFD700346018 /* KoinPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KoinPickerView.swift; sourceTree = ""; }; 83EBB87D2D0FE1BE00346018 /* FetchKoinPickerDateUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchKoinPickerDateUseCase.swift; sourceTree = ""; }; A001E2B42845091D00D6C310 /* koin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = koin.app; sourceTree = BUILT_PRODUCTS_DIR; }; + AA10000000000000000001 /* PublisherTestSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublisherTestSupport.swift; sourceTree = ""; }; + AA10000000000000000002 /* DiningFixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiningFixtures.swift; sourceTree = ""; }; + AA10000000000000000003 /* SpyDiningRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpyDiningRepository.swift; sourceTree = ""; }; + AA10000000000000000004 /* DateProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateProviderTests.swift; sourceTree = ""; }; + AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchDiningListUseCaseTests.swift; sourceTree = ""; }; + AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareMenuListUseCaseTests.swift; sourceTree = ""; }; B438AEE32E756AB600E889C4 /* OrderImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderImage.swift; sourceTree = ""; }; B46B8CC12E76CB7300A8E797 /* ShopSummaryDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopSummaryDto.swift; sourceTree = ""; }; B46B8CC32E76CC6300A8E797 /* FetchOrderShopSummaryFromShopUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchOrderShopSummaryFromShopUseCase.swift; sourceTree = ""; }; @@ -2016,13 +2021,6 @@ D8F5C54B2E6F012500FB6708 /* LottieAnimationManageable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieAnimationManageable.swift; sourceTree = ""; }; D8F5C5532E6F144300FB6708 /* floatingLogo.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = floatingLogo.json; sourceTree = ""; }; EC692285302700A400EE26ED /* koinUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = koinUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - EC69228E302700E800EE26ED /* koinUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = koinUnitTests.swift; sourceTree = ""; }; - AA10000000000000000001 /* PublisherTestSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublisherTestSupport.swift; sourceTree = ""; }; - AA10000000000000000002 /* DiningFixtures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiningFixtures.swift; sourceTree = ""; }; - AA10000000000000000003 /* SpyDiningRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpyDiningRepository.swift; sourceTree = ""; }; - AA10000000000000000004 /* DateProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateProviderTests.swift; sourceTree = ""; }; - AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchDiningListUseCaseTests.swift; sourceTree = ""; }; - AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareMenuListUseCaseTests.swift; sourceTree = ""; }; F1A000010000000000000002 /* ZoomingCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionView.swift; sourceTree = ""; }; F1A000010000000000000004 /* ZoomingCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomingCollectionViewCell.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -4555,6 +4553,33 @@ name = Products; sourceTree = ""; }; + AA30000000000000000001 /* Support */ = { + isa = PBXGroup; + children = ( + AA10000000000000000001 /* PublisherTestSupport.swift */, + AA10000000000000000002 /* DiningFixtures.swift */, + ); + path = Support; + sourceTree = ""; + }; + AA30000000000000000002 /* Doubles */ = { + isa = PBXGroup; + children = ( + AA10000000000000000003 /* SpyDiningRepository.swift */, + ); + path = Doubles; + sourceTree = ""; + }; + AA30000000000000000003 /* Dining */ = { + isa = PBXGroup; + children = ( + AA10000000000000000004 /* DateProviderTests.swift */, + AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */, + AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */, + ); + path = Dining; + sourceTree = ""; + }; B46B8D242E770A3100A8E797 /* Fonts */ = { isa = PBXGroup; children = ( @@ -5469,38 +5494,10 @@ AA30000000000000000001 /* Support */, AA30000000000000000002 /* Doubles */, AA30000000000000000003 /* Dining */, - EC69228E302700E800EE26ED /* koinUnitTests.swift */, ); path = koinUnitTests; sourceTree = ""; }; - AA30000000000000000001 /* Support */ = { - isa = PBXGroup; - children = ( - AA10000000000000000001 /* PublisherTestSupport.swift */, - AA10000000000000000002 /* DiningFixtures.swift */, - ); - path = Support; - sourceTree = ""; - }; - AA30000000000000000002 /* Doubles */ = { - isa = PBXGroup; - children = ( - AA10000000000000000003 /* SpyDiningRepository.swift */, - ); - path = Doubles; - sourceTree = ""; - }; - AA30000000000000000003 /* Dining */ = { - isa = PBXGroup; - children = ( - AA10000000000000000004 /* DateProviderTests.swift */, - AA10000000000000000005 /* FetchDiningListUseCaseTests.swift */, - AA10000000000000000006 /* ShareMenuListUseCaseTests.swift */, - ); - path = Dining; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -6657,7 +6654,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EC692290302700E800EE26ED /* koinUnitTests.swift in Sources */, AA20000000000000000001 /* PublisherTestSupport.swift in Sources */, AA20000000000000000002 /* DiningFixtures.swift in Sources */, AA20000000000000000003 /* SpyDiningRepository.swift in Sources */, diff --git a/koinUnitTests/Dining/DateProviderTests.swift b/koinUnitTests/Dining/DateProviderTests.swift index d354e0f2e..6c8a3989a 100644 --- a/koinUnitTests/Dining/DateProviderTests.swift +++ b/koinUnitTests/Dining/DateProviderTests.swift @@ -67,7 +67,6 @@ struct DateProviderTests { #expect(result.diningType == .dinner) } - /// 18:31과 23:59는 "다음 날 breakfast"라는 동일한 결과를 기대하므로 매개변수화한다. @Test("18:30 이후면 다음 날 breakfast를 반환한다", arguments: [(18, 31), (23, 59)]) func 열여덟시_삼십분_이후면_다음_날_breakfast를_반환한다(hour: Int, minute: Int) throws { let input = try date(hour: hour, minute: minute) diff --git a/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift b/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift index c34711075..528b5c062 100644 --- a/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift +++ b/koinUnitTests/Dining/ShareMenuListUseCaseTests.swift @@ -38,8 +38,6 @@ struct ShareMenuListUseCaseTests { #expect(shareModel.date == "260803") } - /// `DateFormatter`는 구분자가 달라도 관대하게 파싱하기 때문에 "2026/08/03"은 fallback 경로를 타지 않는다. - /// (실제로 "260803"으로 변환된다.) 그래서 파싱이 확실히 실패하는 입력만 검증한다. @Test( "날짜 변환에 실패하면 원본 문자열을 사용한다", arguments: ["", "날짜없음", "2026-13-45"] diff --git a/koinUnitTests/koinUnitTests.swift b/koinUnitTests/koinUnitTests.swift deleted file mode 100644 index fcb4d5789..000000000 --- a/koinUnitTests/koinUnitTests.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// koinUnitTests.swift -// koinUnitTests -// -// Created by 이은지 on 8/8/26. -// - -import Testing - -struct koinUnitTests { - - @Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. - // Swift Testing Documentation - // https://developer.apple.com/documentation/testing - } - -}