From 641bbf433fdd6ab25736bcb637b584f95ad88576 Mon Sep 17 00:00:00 2001 From: Evgeniy Antonov Date: Tue, 5 Jun 2018 13:23:28 +0300 Subject: [PATCH] Add cart api protocol methods --- Podfile | 3 - Podfile.lock | 6 +- ShopApp.xcodeproj/project.pbxproj | 213 +----------------- .../ViewModels/ProductDetailsViewModel.swift | 2 +- ShopApp/AppDelegate.swift | 7 - .../Adapters/CoreDataCartProductAdapter.swift | 41 ---- .../Adapters/CoreDataImageAdapter.swift | 24 -- .../CoreDataProductVariantAdapter.swift | 36 --- .../CoreDataVariantOptionAdapter.swift | 23 -- ShopApp/Data/DAO/CoreData/CoreDataDAO.swift | 126 ----------- .../Extensions/CoreStore+Transaction.swift | 19 -- .../CartProductEntityUpdateService.swift | 31 --- .../Helpers/ImageEntityUpdateService.swift | 21 -- .../ProductVariantEntityUpdateService.swift | 39 ---- .../VariantOptionEntityUpdateService.swift | 16 -- .../ShopApp.xcdatamodel/contents | 105 --------- ShopApp/Data/DAO/DAO.swift | 18 -- ShopApp/Data/DI/DataAssembly.swift | 9 +- .../Repositories/ShopAppCartRepository.swift | 18 +- ShopAppTests/Data/API/Mocks/APIMock.swift | 54 +++++ .../CoreDataCartProductAdapterSpec.swift | 71 ------ .../Adapters/CoreDataImageAdapterSpec.swift | 43 ---- .../CoreDataProductVariantAdapterSpec.swift | 59 ----- .../CoreDataVariantOptionAdapterSpec.swift | 41 ---- .../Data/DAO/CoreData/CoreDataDAOSpec.swift | 209 ----------------- .../DAO/CoreData/CoreDataTestHelper.swift | 23 -- .../CoreStore+TransactionSpec.swift | 70 ------ .../CartProductEntityUpdateServiceSpec.swift | 58 ----- .../ImageEntityUpdateServiceSpec.swift | 44 ---- ...roductVariantEntityUpdateServiceSpec.swift | 65 ------ ...VariantOptionEntityUpdateServiceSpec.swift | 42 ---- ShopAppTests/Data/DAO/Mocks/DAOMock.swift | 67 ------ .../ShopAppCartRepositorySpec.swift | 70 +++--- ShopApp_Gateway/API.swift | 9 + .../Adapters/CartProductAdapter.swift | 26 +++ 35 files changed, 148 insertions(+), 1560 deletions(-) delete mode 100644 ShopApp/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapter.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Adapters/CoreDataImageAdapter.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapter.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapter.swift delete mode 100644 ShopApp/Data/DAO/CoreData/CoreDataDAO.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Extensions/CoreStore+Transaction.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Helpers/CartProductEntityUpdateService.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Helpers/ImageEntityUpdateService.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateService.swift delete mode 100644 ShopApp/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateService.swift delete mode 100644 ShopApp/Data/DAO/CoreData/ShopApp.xcdatamodeld/ShopApp.xcdatamodel/contents delete mode 100644 ShopApp/Data/DAO/DAO.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapterSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataImageAdapterSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapterSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapterSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/CoreDataDAOSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/CoreDataTestHelper.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Extensions/CoreStore+TransactionSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Helpers/CartProductEntityUpdateServiceSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Helpers/ImageEntityUpdateServiceSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateServiceSpec.swift delete mode 100644 ShopAppTests/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateServiceSpec.swift delete mode 100644 ShopAppTests/Data/DAO/Mocks/DAOMock.swift create mode 100644 ShopApp_Gateway/Adapters/CartProductAdapter.swift diff --git a/Podfile b/Podfile index 60c5cb0d..7b496419 100644 --- a/Podfile +++ b/Podfile @@ -25,9 +25,6 @@ target 'ShopApp' do pod 'TTTAttributedLabel', '~> 2.0' pod 'DropDown', '~> 2.0' - # Database - pod 'CoreStore', '~> 4.2' - # Architecture pod 'RxSwift', '~> 4.1' pod 'RxCocoa', '~> 4.1' diff --git a/Podfile.lock b/Podfile.lock index de571676..c013db5a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,6 +1,5 @@ PODS: - AvatarImageView (2.1.1) - - CoreStore (4.2.4) - Crashlytics (3.10.1): - Fabric (~> 1.7.5) - DropDown (2.3.1) @@ -28,7 +27,6 @@ PODS: DEPENDENCIES: - AvatarImageView (~> 2.1) - - CoreStore (~> 4.2) - Crashlytics (~> 3.9) - DropDown (~> 2.0) - Fabric (~> 1.7) @@ -52,7 +50,6 @@ DEPENDENCIES: SPEC REPOS: https://github.com/cocoapods/specs.git: - AvatarImageView - - CoreStore - Crashlytics - DropDown - Fabric @@ -75,7 +72,6 @@ SPEC REPOS: SPEC CHECKSUMS: AvatarImageView: 50618694f9ce37d07fd0250145e733b34197fb5b - CoreStore: 1b8a116d9e3f3e0e0be588b57bc4a7dbb5adf3d5 Crashlytics: aee1a064cbbf99b32efa3f056a5f458d846bc8ff DropDown: 20499c7b2731b0d21609af924e47c7677a2be50d Fabric: f8d42c893bb187326a7968b62abe55c36a987a46 @@ -96,6 +92,6 @@ SPEC CHECKSUMS: "UIImage+Additions": da531911c34e298b46b567a28df03bb098af1389 UIScrollView-InfiniteScroll: c132d6d5851daff229ab4a1060ccf70a05a051c9 -PODFILE CHECKSUM: 90bec9d6bca10399874b51140fee24d1de0f50ed +PODFILE CHECKSUM: a3b644e8c495dc541f23904eb5d990ec93801f5e COCOAPODS: 1.5.2 diff --git a/ShopApp.xcodeproj/project.pbxproj b/ShopApp.xcodeproj/project.pbxproj index 8fcc3e7d..ddb2229d 100644 --- a/ShopApp.xcodeproj/project.pbxproj +++ b/ShopApp.xcodeproj/project.pbxproj @@ -66,7 +66,6 @@ 0B2D85FD206B7F4900D12ED7 /* ShopAppPaymentsRepositorySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2D85FC206B7F4900D12ED7 /* ShopAppPaymentsRepositorySpec.swift */; }; 0B2D85FF206B7F5700D12ED7 /* ShopAppProductRepositorySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2D85FE206B7F5700D12ED7 /* ShopAppProductRepositorySpec.swift */; }; 0B2D8601206B7F6500D12ED7 /* ShopAppShopRepositorySpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2D8600206B7F6500D12ED7 /* ShopAppShopRepositorySpec.swift */; }; - 0B2D8603206B815900D12ED7 /* DAOMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2D8602206B815900D12ED7 /* DAOMock.swift */; }; 0B2F3EC62004EA4000FB40A4 /* NumberFormatter+Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2F3EC52004EA4000FB40A4 /* NumberFormatter+Currency.swift */; }; 0B3AB6F1203199B000F46A8F /* PlaceholderedTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B3AB6F0203199AF00F46A8F /* PlaceholderedTextField.swift */; }; 0B43716C204D66B400C086CF /* AccountViewControllerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B43716B204D66B400C086CF /* AccountViewControllerSpec.swift */; }; @@ -113,8 +112,6 @@ 0B67B477205A5DDA00337379 /* SortVariantTableViewCellSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B67B476205A5DDA00337379 /* SortVariantTableViewCellSpec.swift */; }; 0B67B479205A6E2500337379 /* SearchViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B67B478205A6E2500337379 /* SearchViewModelSpec.swift */; }; 0B67B47B205A9F4300337379 /* SearchEmptyDataViewSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B67B47A205A9F4300337379 /* SearchEmptyDataViewSpec.swift */; }; - 0B69B56F200DFA4000F071E3 /* CoreDataVariantOptionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B69B56E200DFA4000F071E3 /* CoreDataVariantOptionAdapter.swift */; }; - 0B69B571200E1F3900F071E3 /* VariantOptionEntityUpdateService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B69B570200E1F3900F071E3 /* VariantOptionEntityUpdateService.swift */; }; 0B69B575200E29F400F071E3 /* ChangeCartProductUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B69B574200E29F400F071E3 /* ChangeCartProductUseCase.swift */; }; 0B69B577200E2A0300F071E3 /* DeleteCartProductUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B69B576200E2A0300F071E3 /* DeleteCartProductUseCase.swift */; }; 0B6D155F2024843C000DDA14 /* SortVariantsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B6D155E2024843C000DDA14 /* SortVariantsViewController.swift */; }; @@ -214,17 +211,6 @@ 0BADF1142028947B0013DA67 /* CategoryEmptyDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0BADF1132028947B0013DA67 /* CategoryEmptyDataView.xib */; }; 0BADF11720289A980013DA67 /* SearchEmptyDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BADF11620289A980013DA67 /* SearchEmptyDataView.swift */; }; 0BADF11920289AA40013DA67 /* SearchEmptyDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0BADF11820289AA40013DA67 /* SearchEmptyDataView.xib */; }; - 0BB82C66206CE4E00012C40A /* CoreDataCartProductAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C65206CE4E00012C40A /* CoreDataCartProductAdapterSpec.swift */; }; - 0BB82C68206CE4EB0012C40A /* CoreDataImageAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C67206CE4EB0012C40A /* CoreDataImageAdapterSpec.swift */; }; - 0BB82C6A206CE4F50012C40A /* CoreDataProductVariantAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C69206CE4F50012C40A /* CoreDataProductVariantAdapterSpec.swift */; }; - 0BB82C6C206CE5000012C40A /* CoreDataVariantOptionAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C6B206CE5000012C40A /* CoreDataVariantOptionAdapterSpec.swift */; }; - 0BB82C6E206D18370012C40A /* CoreDataTestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C6D206D18370012C40A /* CoreDataTestHelper.swift */; }; - 0BB82C70206D27E10012C40A /* CartProductEntityUpdateServiceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C6F206D27E10012C40A /* CartProductEntityUpdateServiceSpec.swift */; }; - 0BB82C72206D27F10012C40A /* ProductVariantEntityUpdateServiceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C71206D27F10012C40A /* ProductVariantEntityUpdateServiceSpec.swift */; }; - 0BB82C74206D27FC0012C40A /* VariantOptionEntityUpdateServiceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C73206D27FC0012C40A /* VariantOptionEntityUpdateServiceSpec.swift */; }; - 0BB82C76206D28080012C40A /* ImageEntityUpdateServiceSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C75206D28080012C40A /* ImageEntityUpdateServiceSpec.swift */; }; - 0BB82C79206E715A0012C40A /* CoreStore+TransactionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C78206E715A0012C40A /* CoreStore+TransactionSpec.swift */; }; - 0BB82C7B206E748F0012C40A /* CoreDataDAOSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BB82C7A206E748F0012C40A /* CoreDataDAOSpec.swift */; }; 0BC6875D202D980100E46D4C /* CountriesUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC6875C202D980000E46D4C /* CountriesUseCase.swift */; }; 0BCE89212022178700C6B3AD /* CategoryListCollectionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BCE89202022178700C6B3AD /* CategoryListCollectionProvider.swift */; }; 0BCE892420222C6600C6B3AD /* GridCollectionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BCE892320222C6600C6B3AD /* GridCollectionProvider.swift */; }; @@ -312,6 +298,7 @@ 610C2CEE1FB1DF5B0007A1C3 /* ArticleDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610C2CED1FB1DF5B0007A1C3 /* ArticleDetailsViewModel.swift */; }; 611607DF204804C5000A12D6 /* UpdateDefaultAddressUseCaseMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611607DE204804C5000A12D6 /* UpdateDefaultAddressUseCaseMock.swift */; }; 611607E120480557000A12D6 /* DeleteAddressUseCaseMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611607E020480557000A12D6 /* DeleteAddressUseCaseMock.swift */; }; + 6118E48D20C7FA9B00587489 /* CartProductAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6118E48A20C7F84A00587489 /* CartProductAdapter.swift */; }; 611947811FD87540008BE9C6 /* AccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611947801FD87540008BE9C6 /* AccountViewModel.swift */; }; 6119478C1FD964A6008BE9C6 /* Navigation.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6119478B1FD964A6008BE9C6 /* Navigation.storyboard */; }; 6119F2E91FA88ABE00564859 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6119F2E81FA88ABE00564859 /* HomeViewModel.swift */; }; @@ -373,8 +360,6 @@ 6130DE7C2063E43200BAA833 /* String+ValidatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130DE7B2063E43200BAA833 /* String+ValidatorSpec.swift */; }; 6130DE842065252800BAA833 /* TTTAttributedLabel+LinksSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130DE832065252800BAA833 /* TTTAttributedLabel+LinksSpec.swift */; }; 6130DE892065253D00BAA833 /* TTTAttributedLabelDelegateMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6130DE882065253C00BAA833 /* TTTAttributedLabelDelegateMock.swift */; }; - 6131D2381FB31395008330C0 /* DAO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6131D2371FB31395008330C0 /* DAO.swift */; }; - 6131D2471FB33FCB008330C0 /* CoreDataDAO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6131D2461FB33FCB008330C0 /* CoreDataDAO.swift */; }; 613258611FD6EA4C00513854 /* SeeAllTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613258601FD6EA4C00513854 /* SeeAllTableHeaderView.swift */; }; 613258631FD6EA5500513854 /* SeeAllTableHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 613258621FD6EA5500513854 /* SeeAllTableHeaderView.xib */; }; 6133DAD21FB21A6F00156971 /* CartButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6133DAD11FB21A6F00156971 /* CartButtonView.swift */; }; @@ -467,7 +452,6 @@ 6186C31C20501C730057B221 /* ChangeCartProductUseCaseMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6186C31B20501C730057B221 /* ChangeCartProductUseCaseMock.swift */; }; 6186C320205034390057B221 /* CartTableProviderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6186C31F205034390057B221 /* CartTableProviderSpec.swift */; }; 6186C32320503D060057B221 /* CartTableProviderDelegateMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6186C32220503D060057B221 /* CartTableProviderDelegateMock.swift */; }; - 618819B41FB3085600FECDCC /* CoreDataCartProductAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618819B31FB3085600FECDCC /* CoreDataCartProductAdapter.swift */; }; 618A09FA208DCFDD007C1B8F /* QuantityDropDownTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618A09F8208DCFDD007C1B8F /* QuantityDropDownTableViewCell.swift */; }; 618A09FB208DCFDD007C1B8F /* QuantityDropDownTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 618A09F9208DCFDD007C1B8F /* QuantityDropDownTableViewCell.xib */; }; 618A09FD208E061C007C1B8F /* UIViewController+Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 618A09FC208E061C007C1B8F /* UIViewController+Alert.swift */; }; @@ -574,9 +558,6 @@ 61C2ABC51FBB240A00A1E170 /* SignInViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C2ABC41FBB240A00A1E170 /* SignInViewModel.swift */; }; 61C64B8A20667D900037665C /* UIViewController+BarButtonItemsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C64B8920667D900037665C /* UIViewController+BarButtonItemsSpec.swift */; }; 61C64B8E206688F50037665C /* HtmlStringMultimediaCompressorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C64B8C206688A10037665C /* HtmlStringMultimediaCompressorSpec.swift */; }; - 61C95E9B1FB3482400543B40 /* CartProductEntityUpdateService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C95E9A1FB3482300543B40 /* CartProductEntityUpdateService.swift */; }; - 61C95E9D1FB34B9F00543B40 /* ProductVariantEntityUpdateService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C95E9C1FB34B9F00543B40 /* ProductVariantEntityUpdateService.swift */; }; - 61C95E9F1FB3540B00543B40 /* CoreStore+Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C95E9E1FB3540B00543B40 /* CoreStore+Transaction.swift */; }; 61C95EA11FB38F8700543B40 /* Cart.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61C95EA01FB38F8700543B40 /* Cart.storyboard */; }; 61C95EA41FB38FC500543B40 /* CartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C95EA31FB38FC500543B40 /* CartViewController.swift */; }; 61C95EA61FB38FE100543B40 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C95EA51FB38FE100543B40 /* CartViewModel.swift */; }; @@ -599,9 +580,6 @@ 61E4E6341F56C868001C6E01 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E4E6331F56C868001C6E01 /* AppDelegate.swift */; }; 61E4E63B1F56C868001C6E01 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 61E4E63A1F56C868001C6E01 /* Assets.xcassets */; }; 61E4E63E1F56C868001C6E01 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 61E4E63C1F56C868001C6E01 /* LaunchScreen.storyboard */; }; - 61E76E1B1FB46C0200AE5FB4 /* ImageEntityUpdateService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E76E1A1FB46C0200AE5FB4 /* ImageEntityUpdateService.swift */; }; - 61E76E1D1FB46F1200AE5FB4 /* CoreDataProductVariantAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E76E1C1FB46F1200AE5FB4 /* CoreDataProductVariantAdapter.swift */; }; - 61E76E1F1FB4704900AE5FB4 /* CoreDataImageAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E76E1E1FB4704900AE5FB4 /* CoreDataImageAdapter.swift */; }; 61E76E231FB471DB00AE5FB4 /* CartTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E76E211FB471DB00AE5FB4 /* CartTableViewCell.swift */; }; 61E76E241FB471DB00AE5FB4 /* CartTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61E76E221FB471DB00AE5FB4 /* CartTableViewCell.xib */; }; 61E8A21F1FAC93560092EDC1 /* ArticleListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E8A21E1FAC93560092EDC1 /* ArticleListViewModel.swift */; }; @@ -629,7 +607,6 @@ 8E3215B9202E08F500CA4FB4 /* UITableView+Cells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E3215B8202E08F500CA4FB4 /* UITableView+Cells.swift */; }; 8E3215BD202E139500CA4FB4 /* UICollectionView+Cells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E3215BC202E139500CA4FB4 /* UICollectionView+Cells.swift */; }; 8E3215BF20300C4A00CA4FB4 /* UIView+LoadFromNib.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E3215BE20300C4A00CA4FB4 /* UIView+LoadFromNib.swift */; }; - 8E3265DC2037233600B3C50E /* ShopApp.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 8E3265DA2037233600B3C50E /* ShopApp.xcdatamodeld */; }; 8E45017820179C0600D4CF6E /* TextFieldWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E45017720179C0600D4CF6E /* TextFieldWrapper.swift */; }; 8E5EFA832035BA5000FD718B /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E5EFA822035BA4F00FD718B /* CartRepository.swift */; }; 8E5EFAD92035F2BF00FD718B /* ShopApp_Gateway.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8E5EFAD02035F2BF00FD718B /* ShopApp_Gateway.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -756,7 +733,6 @@ 0B2D85FC206B7F4900D12ED7 /* ShopAppPaymentsRepositorySpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopAppPaymentsRepositorySpec.swift; sourceTree = ""; }; 0B2D85FE206B7F5700D12ED7 /* ShopAppProductRepositorySpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopAppProductRepositorySpec.swift; sourceTree = ""; }; 0B2D8600206B7F6500D12ED7 /* ShopAppShopRepositorySpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopAppShopRepositorySpec.swift; sourceTree = ""; }; - 0B2D8602206B815900D12ED7 /* DAOMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DAOMock.swift; sourceTree = ""; }; 0B2F3EC52004EA4000FB40A4 /* NumberFormatter+Currency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NumberFormatter+Currency.swift"; sourceTree = ""; }; 0B3AB6F0203199AF00F46A8F /* PlaceholderedTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaceholderedTextField.swift; sourceTree = ""; }; 0B43716B204D66B400C086CF /* AccountViewControllerSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewControllerSpec.swift; sourceTree = ""; }; @@ -792,8 +768,6 @@ 0B67B476205A5DDA00337379 /* SortVariantTableViewCellSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortVariantTableViewCellSpec.swift; sourceTree = ""; }; 0B67B478205A6E2500337379 /* SearchViewModelSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModelSpec.swift; sourceTree = ""; }; 0B67B47A205A9F4300337379 /* SearchEmptyDataViewSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEmptyDataViewSpec.swift; sourceTree = ""; }; - 0B69B56E200DFA4000F071E3 /* CoreDataVariantOptionAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataVariantOptionAdapter.swift; sourceTree = ""; }; - 0B69B570200E1F3900F071E3 /* VariantOptionEntityUpdateService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VariantOptionEntityUpdateService.swift; sourceTree = ""; }; 0B69B574200E29F400F071E3 /* ChangeCartProductUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeCartProductUseCase.swift; sourceTree = ""; }; 0B69B576200E2A0300F071E3 /* DeleteCartProductUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteCartProductUseCase.swift; sourceTree = ""; }; 0B6D155E2024843C000DDA14 /* SortVariantsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortVariantsViewController.swift; sourceTree = ""; }; @@ -903,17 +877,6 @@ 0BADF1132028947B0013DA67 /* CategoryEmptyDataView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CategoryEmptyDataView.xib; sourceTree = ""; }; 0BADF11620289A980013DA67 /* SearchEmptyDataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEmptyDataView.swift; sourceTree = ""; }; 0BADF11820289AA40013DA67 /* SearchEmptyDataView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchEmptyDataView.xib; sourceTree = ""; }; - 0BB82C65206CE4E00012C40A /* CoreDataCartProductAdapterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataCartProductAdapterSpec.swift; sourceTree = ""; }; - 0BB82C67206CE4EB0012C40A /* CoreDataImageAdapterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataImageAdapterSpec.swift; sourceTree = ""; }; - 0BB82C69206CE4F50012C40A /* CoreDataProductVariantAdapterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataProductVariantAdapterSpec.swift; sourceTree = ""; }; - 0BB82C6B206CE5000012C40A /* CoreDataVariantOptionAdapterSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataVariantOptionAdapterSpec.swift; sourceTree = ""; }; - 0BB82C6D206D18370012C40A /* CoreDataTestHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataTestHelper.swift; sourceTree = ""; }; - 0BB82C6F206D27E10012C40A /* CartProductEntityUpdateServiceSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartProductEntityUpdateServiceSpec.swift; sourceTree = ""; }; - 0BB82C71206D27F10012C40A /* ProductVariantEntityUpdateServiceSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductVariantEntityUpdateServiceSpec.swift; sourceTree = ""; }; - 0BB82C73206D27FC0012C40A /* VariantOptionEntityUpdateServiceSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VariantOptionEntityUpdateServiceSpec.swift; sourceTree = ""; }; - 0BB82C75206D28080012C40A /* ImageEntityUpdateServiceSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageEntityUpdateServiceSpec.swift; sourceTree = ""; }; - 0BB82C78206E715A0012C40A /* CoreStore+TransactionSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreStore+TransactionSpec.swift"; sourceTree = ""; }; - 0BB82C7A206E748F0012C40A /* CoreDataDAOSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataDAOSpec.swift; sourceTree = ""; }; 0BC6875C202D980000E46D4C /* CountriesUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountriesUseCase.swift; sourceTree = ""; }; 0BCE89202022178700C6B3AD /* CategoryListCollectionProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryListCollectionProvider.swift; sourceTree = ""; }; 0BCE892320222C6600C6B3AD /* GridCollectionProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridCollectionProvider.swift; sourceTree = ""; }; @@ -1007,6 +970,7 @@ 610C2CED1FB1DF5B0007A1C3 /* ArticleDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleDetailsViewModel.swift; sourceTree = ""; }; 611607DE204804C5000A12D6 /* UpdateDefaultAddressUseCaseMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateDefaultAddressUseCaseMock.swift; sourceTree = ""; }; 611607E020480557000A12D6 /* DeleteAddressUseCaseMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteAddressUseCaseMock.swift; sourceTree = ""; }; + 6118E48A20C7F84A00587489 /* CartProductAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CartProductAdapter.swift; sourceTree = ""; }; 611947801FD87540008BE9C6 /* AccountViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewModel.swift; sourceTree = ""; }; 6119478B1FD964A6008BE9C6 /* Navigation.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Navigation.storyboard; sourceTree = ""; }; 6119F2E81FA88ABE00564859 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; @@ -1068,8 +1032,6 @@ 6130DE7B2063E43200BAA833 /* String+ValidatorSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ValidatorSpec.swift"; sourceTree = ""; }; 6130DE832065252800BAA833 /* TTTAttributedLabel+LinksSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TTTAttributedLabel+LinksSpec.swift"; sourceTree = ""; }; 6130DE882065253C00BAA833 /* TTTAttributedLabelDelegateMock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TTTAttributedLabelDelegateMock.swift; sourceTree = ""; }; - 6131D2371FB31395008330C0 /* DAO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DAO.swift; sourceTree = ""; }; - 6131D2461FB33FCB008330C0 /* CoreDataDAO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataDAO.swift; sourceTree = ""; }; 613258601FD6EA4C00513854 /* SeeAllTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeeAllTableHeaderView.swift; sourceTree = ""; }; 613258621FD6EA5500513854 /* SeeAllTableHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SeeAllTableHeaderView.xib; sourceTree = ""; }; 6133DAD11FB21A6F00156971 /* CartButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartButtonView.swift; sourceTree = ""; }; @@ -1172,7 +1134,6 @@ 6186C31B20501C730057B221 /* ChangeCartProductUseCaseMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeCartProductUseCaseMock.swift; sourceTree = ""; }; 6186C31F205034390057B221 /* CartTableProviderSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartTableProviderSpec.swift; sourceTree = ""; }; 6186C32220503D060057B221 /* CartTableProviderDelegateMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartTableProviderDelegateMock.swift; sourceTree = ""; }; - 618819B31FB3085600FECDCC /* CoreDataCartProductAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataCartProductAdapter.swift; sourceTree = ""; }; 618A09F8208DCFDD007C1B8F /* QuantityDropDownTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuantityDropDownTableViewCell.swift; sourceTree = ""; }; 618A09F9208DCFDD007C1B8F /* QuantityDropDownTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QuantityDropDownTableViewCell.xib; sourceTree = ""; }; 618A09FC208E061C007C1B8F /* UIViewController+Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+Alert.swift"; sourceTree = ""; }; @@ -1281,9 +1242,6 @@ 61C2ABC41FBB240A00A1E170 /* SignInViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewModel.swift; sourceTree = ""; }; 61C64B8920667D900037665C /* UIViewController+BarButtonItemsSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+BarButtonItemsSpec.swift"; sourceTree = ""; }; 61C64B8C206688A10037665C /* HtmlStringMultimediaCompressorSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HtmlStringMultimediaCompressorSpec.swift; sourceTree = ""; }; - 61C95E9A1FB3482300543B40 /* CartProductEntityUpdateService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartProductEntityUpdateService.swift; sourceTree = ""; }; - 61C95E9C1FB34B9F00543B40 /* ProductVariantEntityUpdateService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductVariantEntityUpdateService.swift; sourceTree = ""; }; - 61C95E9E1FB3540B00543B40 /* CoreStore+Transaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreStore+Transaction.swift"; sourceTree = ""; }; 61C95EA01FB38F8700543B40 /* Cart.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Cart.storyboard; sourceTree = ""; }; 61C95EA31FB38FC500543B40 /* CartViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewController.swift; sourceTree = ""; }; 61C95EA51FB38FE100543B40 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; @@ -1303,9 +1261,6 @@ 61E4E63A1F56C868001C6E01 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 61E4E63D1F56C868001C6E01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 61E4E63F1F56C868001C6E01 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 61E76E1A1FB46C0200AE5FB4 /* ImageEntityUpdateService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageEntityUpdateService.swift; sourceTree = ""; }; - 61E76E1C1FB46F1200AE5FB4 /* CoreDataProductVariantAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataProductVariantAdapter.swift; sourceTree = ""; }; - 61E76E1E1FB4704900AE5FB4 /* CoreDataImageAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataImageAdapter.swift; sourceTree = ""; }; 61E76E211FB471DB00AE5FB4 /* CartTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartTableViewCell.swift; sourceTree = ""; }; 61E76E221FB471DB00AE5FB4 /* CartTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CartTableViewCell.xib; sourceTree = ""; }; 61E8A21E1FAC93560092EDC1 /* ArticleListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleListViewModel.swift; sourceTree = ""; }; @@ -1335,7 +1290,6 @@ 8E3215B8202E08F500CA4FB4 /* UITableView+Cells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Cells.swift"; sourceTree = ""; }; 8E3215BC202E139500CA4FB4 /* UICollectionView+Cells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Cells.swift"; sourceTree = ""; }; 8E3215BE20300C4A00CA4FB4 /* UIView+LoadFromNib.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+LoadFromNib.swift"; sourceTree = ""; }; - 8E3265DB2037233600B3C50E /* ShopApp.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = ShopApp.xcdatamodel; sourceTree = ""; }; 8E45017720179C0600D4CF6E /* TextFieldWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldWrapper.swift; sourceTree = ""; }; 8E5EFA822035BA4F00FD718B /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; 8E5EFAD02035F2BF00FD718B /* ShopApp_Gateway.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShopApp_Gateway.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1421,17 +1375,6 @@ path = Repositories; sourceTree = ""; }; - 0B0955B920692E1F00CABE29 /* Helpers */ = { - isa = PBXGroup; - children = ( - 61C95E9A1FB3482300543B40 /* CartProductEntityUpdateService.swift */, - 61C95E9C1FB34B9F00543B40 /* ProductVariantEntityUpdateService.swift */, - 0B69B570200E1F3900F071E3 /* VariantOptionEntityUpdateService.swift */, - 61E76E1A1FB46C0200AE5FB4 /* ImageEntityUpdateService.swift */, - ); - path = Helpers; - sourceTree = ""; - }; 0B24F0B220074D7400F13224 /* CheckoutShippingAddressAddTableViewCell */ = { isa = PBXGroup; children = ( @@ -1581,15 +1524,6 @@ path = API; sourceTree = ""; }; - 0B2D85EB206B7BCA00D12ED7 /* DAO */ = { - isa = PBXGroup; - children = ( - 0BB82C62206CE4940012C40A /* CoreData */, - 0B2D85ED206B7BE100D12ED7 /* Mocks */, - ); - path = DAO; - sourceTree = ""; - }; 0B2D85EC206B7BDD00D12ED7 /* Mocks */ = { isa = PBXGroup; children = ( @@ -1598,14 +1532,6 @@ path = Mocks; sourceTree = ""; }; - 0B2D85ED206B7BE100D12ED7 /* Mocks */ = { - isa = PBXGroup; - children = ( - 0B2D8602206B815900D12ED7 /* DAOMock.swift */, - ); - path = Mocks; - sourceTree = ""; - }; 0B2F3EC7200525EB00FB40A4 /* ProductOptionCollectionViewCell */ = { isa = PBXGroup; children = ( @@ -2008,7 +1934,6 @@ isa = PBXGroup; children = ( 0B2D85EA206B7BC300D12ED7 /* API */, - 0B2D85EB206B7BCA00D12ED7 /* DAO */, 0B7CEF81203B1F5500FAA32C /* Repositories */, ); path = Data; @@ -2419,48 +2344,6 @@ path = SearchEmptyDataView; sourceTree = ""; }; - 0BB82C62206CE4940012C40A /* CoreData */ = { - isa = PBXGroup; - children = ( - 0BB82C63206CE4A80012C40A /* Adapters */, - 0BB82C77206E713A0012C40A /* Extensions */, - 0BB82C64206CE4AE0012C40A /* Helpers */, - 0BB82C7A206E748F0012C40A /* CoreDataDAOSpec.swift */, - 0BB82C6D206D18370012C40A /* CoreDataTestHelper.swift */, - ); - path = CoreData; - sourceTree = ""; - }; - 0BB82C63206CE4A80012C40A /* Adapters */ = { - isa = PBXGroup; - children = ( - 0BB82C65206CE4E00012C40A /* CoreDataCartProductAdapterSpec.swift */, - 0BB82C67206CE4EB0012C40A /* CoreDataImageAdapterSpec.swift */, - 0BB82C69206CE4F50012C40A /* CoreDataProductVariantAdapterSpec.swift */, - 0BB82C6B206CE5000012C40A /* CoreDataVariantOptionAdapterSpec.swift */, - ); - path = Adapters; - sourceTree = ""; - }; - 0BB82C64206CE4AE0012C40A /* Helpers */ = { - isa = PBXGroup; - children = ( - 0BB82C6F206D27E10012C40A /* CartProductEntityUpdateServiceSpec.swift */, - 0BB82C71206D27F10012C40A /* ProductVariantEntityUpdateServiceSpec.swift */, - 0BB82C73206D27FC0012C40A /* VariantOptionEntityUpdateServiceSpec.swift */, - 0BB82C75206D28080012C40A /* ImageEntityUpdateServiceSpec.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - 0BB82C77206E713A0012C40A /* Extensions */ = { - isa = PBXGroup; - children = ( - 0BB82C78206E715A0012C40A /* CoreStore+TransactionSpec.swift */, - ); - path = Extensions; - sourceTree = ""; - }; 0BCE892220222C4B00C6B3AD /* Providers */ = { isa = PBXGroup; children = ( @@ -2484,7 +2367,6 @@ 0BD5EB2E1FF3D8FB0076C01B /* Data */ = { isa = PBXGroup; children = ( - 61AFA3F11F9DFBE8004B9D53 /* DAO */, 8E131CA1203B3E2B00EB2F63 /* DI */, 8ED91FCD2035904C00E9692A /* Repositories */, ); @@ -2924,6 +2806,14 @@ path = AddressListTableHeaderView; sourceTree = ""; }; + 6118E48920C7F7CC00587489 /* Adapters */ = { + isa = PBXGroup; + children = ( + 6118E48A20C7F84A00587489 /* CartProductAdapter.swift */, + ); + path = Adapters; + sourceTree = ""; + }; 611E737C2092282200F5658D /* CriticalErrorView */ = { isa = PBXGroup; children = ( @@ -3214,18 +3104,6 @@ path = Modules; sourceTree = ""; }; - 6131D2431FB33F48008330C0 /* CoreData */ = { - isa = PBXGroup; - children = ( - 618819B51FB3088200FECDCC /* Adapters */, - 61C95E991FB347FE00543B40 /* Extensions */, - 0B0955B920692E1F00CABE29 /* Helpers */, - 6131D2461FB33FCB008330C0 /* CoreDataDAO.swift */, - 8E3265DA2037233600B3C50E /* ShopApp.xcdatamodeld */, - ); - path = CoreData; - sourceTree = ""; - }; 6132585F1FD6EA1D00513854 /* SeeAllTableHeaderView */ = { isa = PBXGroup; children = ( @@ -3488,17 +3366,6 @@ path = Mocks; sourceTree = ""; }; - 618819B51FB3088200FECDCC /* Adapters */ = { - isa = PBXGroup; - children = ( - 618819B31FB3085600FECDCC /* CoreDataCartProductAdapter.swift */, - 61E76E1E1FB4704900AE5FB4 /* CoreDataImageAdapter.swift */, - 61E76E1C1FB46F1200AE5FB4 /* CoreDataProductVariantAdapter.swift */, - 0B69B56E200DFA4000F071E3 /* CoreDataVariantOptionAdapter.swift */, - ); - path = Adapters; - sourceTree = ""; - }; 618A09F7208DCF91007C1B8F /* QuantityDropDownTableViewCell */ = { isa = PBXGroup; children = ( @@ -3609,15 +3476,6 @@ path = Mocks; sourceTree = ""; }; - 61AFA3F11F9DFBE8004B9D53 /* DAO */ = { - isa = PBXGroup; - children = ( - 6131D2431FB33F48008330C0 /* CoreData */, - 6131D2371FB31395008330C0 /* DAO.swift */, - ); - path = DAO; - sourceTree = ""; - }; 61BA57081FE0409200BF1586 /* CartEmptyDataView */ = { isa = PBXGroup; children = ( @@ -3763,14 +3621,6 @@ path = Mocks; sourceTree = ""; }; - 61C95E991FB347FE00543B40 /* Extensions */ = { - isa = PBXGroup; - children = ( - 61C95E9E1FB3540B00543B40 /* CoreStore+Transaction.swift */, - ); - path = Extensions; - sourceTree = ""; - }; 61CEAA641F5E98110016FBD7 /* Constants */ = { isa = PBXGroup; children = ( @@ -3983,6 +3833,7 @@ 8E5EFAD12035F2BF00FD718B /* ShopApp_Gateway */ = { isa = PBXGroup; children = ( + 6118E48920C7F7CC00587489 /* Adapters */, 8E5EFAF92035F34300FD718B /* Models */, 0B1AB003206A46C100A24E5B /* API.swift */, 8E5EFB132035F34400FD718B /* ShopApp_Gateway.h */, @@ -4322,7 +4173,6 @@ inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-ShopApp/Pods-ShopApp-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AvatarImageView/AvatarImageView.framework", - "${BUILT_PRODUCTS_DIR}/CoreStore/CoreStore.framework", "${BUILT_PRODUCTS_DIR}/DropDown/DropDown.framework", "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework", "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", @@ -4341,7 +4191,6 @@ name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AvatarImageView.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoreStore.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DropDown.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", @@ -4384,7 +4233,6 @@ inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-ShopApp-ShopAppTests/Pods-ShopApp-ShopAppTests-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AvatarImageView/AvatarImageView.framework", - "${BUILT_PRODUCTS_DIR}/CoreStore/CoreStore.framework", "${BUILT_PRODUCTS_DIR}/DropDown/DropDown.framework", "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework", "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", @@ -4405,7 +4253,6 @@ name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AvatarImageView.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoreStore.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DropDown.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", @@ -4459,7 +4306,6 @@ 0BE9658F20442EF100308CA9 /* OrderListTableProviderDelegateMock.swift in Sources */, 0BE965B12045AFF900308CA9 /* BasePickerSpec.swift in Sources */, 61ABAF6B205977E100D73392 /* CategoryListViewModelMock.swift in Sources */, - 0BB82C6E206D18370012C40A /* CoreDataTestHelper.swift in Sources */, 6199776E203C952100C70172 /* OrderListTableProviderSpec.swift in Sources */, 6141712820A9C68D002BEFD3 /* CheckboxButtonSpec.swift in Sources */, 0B5768D5204D3B040001738D /* OrderListViewControllerSpec.swift in Sources */, @@ -4473,7 +4319,6 @@ 0BA5DC1D2073AFA500668C99 /* CountriesUseCaseSpec.swift in Sources */, 617D688C203C5E74001E8940 /* OrderListUseCaseMock.swift in Sources */, 0B7CEF7F203B175600FAA32C /* ChangePasswordViewModelSpec.swift in Sources */, - 0BB82C66206CE4E00012C40A /* CoreDataCartProductAdapterSpec.swift in Sources */, 614C80B02046D5CB006A99E0 /* AccountAddressFormViewControllerSpec.swift in Sources */, 0BEAE1AA20724B69001AE4F8 /* SignUpUseCaseSpec.swift in Sources */, 0B5768D2204D3B040001738D /* ForgotPasswordViewControllerSpec.swift in Sources */, @@ -4482,7 +4327,6 @@ 61276E3420581BC400E2C3AF /* ArticleListViewControllerSpec.swift in Sources */, 61CCF0C02060009B004CF487 /* ImagesCarouselCollectionProviderSpec.swift in Sources */, 6122F5DE2052E7D900F574BB /* CartTableCellDelegateMock.swift in Sources */, - 0BB82C6A206CE4F50012C40A /* CoreDataProductVariantAdapterSpec.swift in Sources */, 61ABAF6A205977E100D73392 /* CategoryViewModelMock.swift in Sources */, 614B6DED205840D30000356E /* PopularTableViewCellSpec.swift in Sources */, 614ED7E1203F34FC00435708 /* OrderDetailsTableProviderDelegateMock.swift in Sources */, @@ -4524,7 +4368,6 @@ 0B2D85FF206B7F5700D12ED7 /* ShopAppProductRepositorySpec.swift in Sources */, 0B8445D6206014D60009012A /* UnderlinedButtonSpec.swift in Sources */, 0B5768DA204D3B040001738D /* SignUpViewControllerSpec.swift in Sources */, - 0BB82C72206D27F10012C40A /* ProductVariantEntityUpdateServiceSpec.swift in Sources */, 0B83E00A20504AA10037035D /* GridCollectionViewControllerSpec.swift in Sources */, 0BEAE1A820724B4A001AE4F8 /* ShopUseCaseSpec.swift in Sources */, 611E737B2091BF3900F5658D /* CartValidationUseCaseSpec.swift in Sources */, @@ -4543,7 +4386,6 @@ 61276E2A20581BC400E2C3AF /* HomeViewModelMock.swift in Sources */, 0BA5DC102073905100668C99 /* CategoryListUseCaseSpec.swift in Sources */, 61ABAF472058541E00D73392 /* PopularTableCellProviderDelegateMock.swift in Sources */, - 0BB82C6C206CE5000012C40A /* CoreDataVariantOptionAdapterSpec.swift in Sources */, 6130DE722062C27500BAA833 /* ProductOptionHeaderViewSpec.swift in Sources */, 0B83E01920566C1B0037035D /* ArticleRepositoryMock.swift in Sources */, 61C0613B20A9D16B00250A1F /* CheckoutPaymentAddTableViewCellSpec.swift in Sources */, @@ -4569,7 +4411,6 @@ 0B8445E92062927F0009012A /* SeeAllTableHeaderViewSpec.swift in Sources */, 61ABAF6D205977F100D73392 /* CategoryEmptyDataViewSpec.swift in Sources */, 61C0614020A9D16C00250A1F /* CheckoutShippingOptionsDisabledTableViewCellSpec.swift in Sources */, - 0B2D8603206B815900D12ED7 /* DAOMock.swift in Sources */, 6104CD0B2065330B00B780A0 /* UIColor+InitializationSpec.swift in Sources */, 61C061AF20AB20FE00250A1F /* CheckoutFailureViewControllerSpec.swift in Sources */, 61E14D4D20405874000AB2CB /* PaymentsRepositoryMock.swift in Sources */, @@ -4629,7 +4470,6 @@ 61C061BD20AB210B00250A1F /* PaymentTypeViewControllerDelegateMock.swift in Sources */, 0BE96578204004D200308CA9 /* SignUpViewModelMock.swift in Sources */, 61BA33FD2049527F0054FCA7 /* BaseAddressListViewControllerSpec.swift in Sources */, - 0BB82C68206CE4EB0012C40A /* CoreDataImageAdapterSpec.swift in Sources */, 0BA5DC17207390E900668C99 /* ProductUseCaseSpec.swift in Sources */, 0BA5DC272073C08D00668C99 /* CheckoutUseCaseSpec.swift in Sources */, 61C0613220A9D16B00250A1F /* AddressListTableCellDelegateMock.swift in Sources */, @@ -4651,7 +4491,6 @@ 0B8445C9205AB9BD0009012A /* SearchTitleViewDelegateMock.swift in Sources */, 0B764723204809E80019D2CE /* SwitchTableCellDelegateMock.swift in Sources */, 614C80CE2046F983006A99E0 /* AccountAddressFormControllerDelegateMock.swift in Sources */, - 0BB82C74206D27FC0012C40A /* VariantOptionEntityUpdateServiceSpec.swift in Sources */, 61276E2920581BC400E2C3AF /* ArticleDetailsViewModelMock.swift in Sources */, 0B83E0372056CEAF0037035D /* CategoryRepositoryMock.swift in Sources */, 61C0613920A9D16B00250A1F /* CheckoutCreditCardEditTableViewCellSpec.swift in Sources */, @@ -4661,7 +4500,6 @@ 0B5768D7204D3B040001738D /* PolicyViewControllerSpec.swift in Sources */, 617D688E203C5EF3001E8940 /* OrderListViewModelSpec.swift in Sources */, 0B83E001204EC3AC0037035D /* AccountNotLoggedHeaderDelegateMock.swift in Sources */, - 0BB82C7B206E748F0012C40A /* CoreDataDAOSpec.swift in Sources */, 61276E3020581BC400E2C3AF /* ArticleListTableProviderSpec.swift in Sources */, 0B437178204D783A00C086CF /* OrderFooterViewMock.swift in Sources */, 61C0613820A9D16B00250A1F /* CustomerEmailTableViewCellSpec.swift in Sources */, @@ -4705,7 +4543,6 @@ 6104CD0F2065563A00B780A0 /* NavigationController+ShadowSpec.swift in Sources */, 616CF744205FFF9500DE14B1 /* ProductDetailsViewModelSpec.swift in Sources */, 614B6DEF205849AD0000356E /* PopularTableCellDelegateMock.swift in Sources */, - 0BB82C70206D27E10012C40A /* CartProductEntityUpdateServiceSpec.swift in Sources */, 6122F5E12052FF8300F574BB /* CartHeaderViewSpec.swift in Sources */, 0B5768D0204D3B040001738D /* BaseAddressFormViewControllerSpec.swift in Sources */, 61ABAF5C205976F500D73392 /* CategoryListViewControllerSpec.swift in Sources */, @@ -4713,7 +4550,6 @@ 0B83DFFD204EC0130037035D /* AccountFooterViewSpec.swift in Sources */, 0B8445CD205ABBF60009012A /* SearchViewModelMock.swift in Sources */, 0B2D85F7206B7F2700D12ED7 /* ShopAppCategoryRepositorySpec.swift in Sources */, - 0BB82C79206E715A0012C40A /* CoreStore+TransactionSpec.swift in Sources */, 0BA5DC0A2073902D00668C99 /* AddCartProductUseCaseSpec.swift in Sources */, 61CCF0C2206000B1004CF487 /* ImagesCarouselViewControllerSpec.swift in Sources */, 0B8445DA2060F7E90009012A /* QuantityDropDownViewDelegateMock.swift in Sources */, @@ -4731,7 +4567,6 @@ 61276E2820581BC400E2C3AF /* ArticleListViewModelMock.swift in Sources */, 0B8445F02062AAF70009012A /* PaymentDetailsFooterViewSpec.swift in Sources */, 61CCF0C1206000A2004CF487 /* ImagesCarouselCollectionProviderDelegateMock.swift in Sources */, - 0BB82C76206D28080012C40A /* ImageEntityUpdateServiceSpec.swift in Sources */, 614ED7DD203F0CBD00435708 /* OrderUseCaseMock.swift in Sources */, 614C80B42046DA6C006A99E0 /* AddAddressUseCaseMock.swift in Sources */, 614B6DE920582FCE0000356E /* LastArrivalsTableCellProviderSpec.swift in Sources */, @@ -4807,10 +4642,8 @@ 616CA66A1FF3BAB800FF14E2 /* BaseAddressListViewModel.swift in Sources */, 61836C5B1FDACC9F000A6BA6 /* NavigationController.swift in Sources */, 0B24F0FD2007514500F13224 /* DetailsImagesCollectionViewCell.swift in Sources */, - 61C95E9F1FB3540B00543B40 /* CoreStore+Transaction.swift in Sources */, 61393A761FACC1AA0020C345 /* ProductListViewModel.swift in Sources */, 610C2CEE1FB1DF5B0007A1C3 /* ArticleDetailsViewModel.swift in Sources */, - 61C95E9D1FB34B9F00543B40 /* ProductVariantEntityUpdateService.swift in Sources */, 61A54BED1FF5252600D4D151 /* AccountLoggedHeaderView.swift in Sources */, 0B0955AE2068FC0B00CABE29 /* ShopAppShopRepository.swift in Sources */, 6170421C2019FAC00063E369 /* CheckoutBillingAddressEditTableViewCell.swift in Sources */, @@ -4831,8 +4664,6 @@ 6119F2F81FA9EE3500564859 /* BaseCollectionViewController.swift in Sources */, 8ED91FAE203460B200E9692A /* Address+Details.swift in Sources */, 612812CC20238AA30048013B /* PaymentTypeProvider.swift in Sources */, - 0B69B571200E1F3900F071E3 /* VariantOptionEntityUpdateService.swift in Sources */, - 8E3265DC2037233600B3C50E /* ShopApp.xcdatamodeld in Sources */, 61A2AC731FACC2B2005FAD54 /* SearchViewModel.swift in Sources */, 0BEF52D61FF6997700E50080 /* CategoryListUseCase.swift in Sources */, 8E131CBB203C93B300EB2F63 /* CheckoutAssembly.swift in Sources */, @@ -4840,7 +4671,6 @@ 6182BA641FFBAE1500836979 /* CreditCardViewController.swift in Sources */, 61AB7D2B2010BD2900DB9D44 /* CheckoutShippingOptionsDisabledTableViewCell.swift in Sources */, 0BED64C0201603C6006CF968 /* SettingsViewController.swift in Sources */, - 6131D2471FB33FCB008330C0 /* CoreDataDAO.swift in Sources */, 61EA41E5208A23EA00E3F7AC /* QuantityDropDownView.swift in Sources */, 61534F301F73EE5E00F24189 /* ProductListViewController.swift in Sources */, 61A5072F1F7E79FB004504EF /* ImagesCarouselViewController.swift in Sources */, @@ -4862,12 +4692,10 @@ 0B69B577200E2A0300F071E3 /* DeleteCartProductUseCase.swift in Sources */, 0B7CEF90203C024600FAA32C /* TableView.swift in Sources */, 0BEF52D81FF69DC900E50080 /* CategoryUseCase.swift in Sources */, - 61C95E9B1FB3482400543B40 /* CartProductEntityUpdateService.swift in Sources */, 0BE6E4872006667600EAEC76 /* String+Localization.swift in Sources */, 618A09FA208DCFDD007C1B8F /* QuantityDropDownTableViewCell.swift in Sources */, 0BED64D020163FE5006CF968 /* PersonalInfoViewController.swift in Sources */, 0B24F0CC20074D7500F13224 /* CheckoutShippingAddressAddTableViewCell.swift in Sources */, - 618819B41FB3085600FECDCC /* CoreDataCartProductAdapter.swift in Sources */, 0B3AB6F1203199B000F46A8F /* PlaceholderedTextField.swift in Sources */, 6124BCE31F73C2880099E879 /* PolicyViewController.swift in Sources */, 61AB7D302010CB5700DB9D44 /* CheckoutShippingOptionsEnabledTableViewCell.swift in Sources */, @@ -4880,7 +4708,6 @@ 8ED91FB4203461F600E9692A /* SortingValue+Details.swift in Sources */, 61719B9B1FC2FCE5007B6ED0 /* CartHeaderView.swift in Sources */, 617000E41FAA031E00DB898C /* BaseViewController.swift in Sources */, - 0B69B56F200DFA4000F071E3 /* CoreDataVariantOptionAdapter.swift in Sources */, 0BD5EB411FF3F19D0076C01B /* LogoutUseCase.swift in Sources */, 0BEF52D21FF66AD700E50080 /* ProductUseCase.swift in Sources */, 0B0955AC2068FC0B00CABE29 /* ShopAppProductRepository.swift in Sources */, @@ -4901,10 +4728,8 @@ 6104242A1FC477D100EFEFDA /* AddressFormViewController.swift in Sources */, 6133DAD21FB21A6F00156971 /* CartButtonView.swift in Sources */, 0B4EA3481FFBBF9D000C7A80 /* ResetPasswordUseCase.swift in Sources */, - 61E76E1B1FB46C0200AE5FB4 /* ImageEntityUpdateService.swift in Sources */, 6152B1241F7914E800045A42 /* ArticleListViewController.swift in Sources */, 8E131CB5203C73E600EB2F63 /* AccountAssembly.swift in Sources */, - 61E76E1F1FB4704900AE5FB4 /* CoreDataImageAdapter.swift in Sources */, 0B7CEF88203BFE9000FAA32C /* Colors.swift in Sources */, 614142C51F6AF15B00379BB9 /* LastArrivalsTableViewCell.swift in Sources */, 0B0955B820691E4E00CABE29 /* ShopAppCustomerRepository.swift in Sources */, @@ -4962,7 +4787,6 @@ 61BA570A1FE040D900BF1586 /* CartEmptyDataView.swift in Sources */, 8E3215BF20300C4A00CA4FB4 /* UIView+LoadFromNib.swift in Sources */, 0B9B1E3A1FF4EDB000FECA8E /* SignUpUseCase.swift in Sources */, - 6131D2381FB31395008330C0 /* DAO.swift in Sources */, 0BD7535E201F4AE600AB1FED /* OrderDetailsTableProvider.swift in Sources */, 0BA630661FFE8BC4007088B8 /* OrderUseCase.swift in Sources */, 0BEF52CF1FF6469900E50080 /* ArticleTableViewCell.swift in Sources */, @@ -4987,7 +4811,6 @@ 6182BA661FFBAE2D00836979 /* CreditCardViewModel.swift in Sources */, 6119F2F51FA9EA1F00564859 /* BaseTableViewController.swift in Sources */, 617DE1851FB5E9E2004EEF9A /* AccountViewController.swift in Sources */, - 61E76E1D1FB46F1200AE5FB4 /* CoreDataProductVariantAdapter.swift in Sources */, 616A8ADD1FE82F670013E41F /* CategoryCollectionViewCell.swift in Sources */, 61EC8D7520334D070001FF2B /* CheckoutAddressListViewModel.swift in Sources */, 0BA630791FFFC554007088B8 /* OrderItemTableViewCell.swift in Sources */, @@ -5027,6 +4850,7 @@ 8E5EFB1E2035F34400FD718B /* Address.swift in Sources */, 8E5EFB282035F34400FD718B /* Country.swift in Sources */, 8E5EFB302035F34400FD718B /* Shop.swift in Sources */, + 6118E48D20C7FA9B00587489 /* CartProductAdapter.swift in Sources */, 8E5EFB272035F34400FD718B /* VariantOption.swift in Sources */, 8E5EFB322035F34400FD718B /* Article.swift in Sources */, 8E5EFB242035F34400FD718B /* Image.swift in Sources */, @@ -5624,19 +5448,6 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCVersionGroup section */ - 8E3265DA2037233600B3C50E /* ShopApp.xcdatamodeld */ = { - isa = XCVersionGroup; - children = ( - 8E3265DB2037233600B3C50E /* ShopApp.xcdatamodel */, - ); - currentVersion = 8E3265DB2037233600B3C50E /* ShopApp.xcdatamodel */; - path = ShopApp.xcdatamodeld; - sourceTree = ""; - versionGroupType = wrapper.xcdatamodel; - }; -/* End XCVersionGroup section */ }; rootObject = 61E4E6281F56C868001C6E01 /* Project object */; } diff --git a/ShopApp/App/Modules/Main/ViewModels/ProductDetailsViewModel.swift b/ShopApp/App/Modules/Main/ViewModels/ProductDetailsViewModel.swift index 14ace245..4df56cf7 100644 --- a/ShopApp/App/Modules/Main/ViewModels/ProductDetailsViewModel.swift +++ b/ShopApp/App/Modules/Main/ViewModels/ProductDetailsViewModel.swift @@ -41,7 +41,7 @@ class ProductDetailsViewModel: BaseViewModel { return Disposables.create() } let productQuantity = strongSelf.quantity.value - guard let cartProduct = CoreDataCartProductAdapter.adapt(product: strongSelf.product.value, productQuantity: productQuantity, variant: strongSelf.selectedProductVariant) else { + guard let cartProduct = CartProductAdapter.adapt(product: strongSelf.product.value, productQuantity: productQuantity, variant: strongSelf.selectedProductVariant) else { event.onNext(false) return Disposables.create() } diff --git a/ShopApp/AppDelegate.swift b/ShopApp/AppDelegate.swift index 7aff8cb9..fd95af8f 100644 --- a/ShopApp/AppDelegate.swift +++ b/ShopApp/AppDelegate.swift @@ -8,7 +8,6 @@ import UIKit -import CoreStore import Fabric import Crashlytics import Swinject @@ -31,12 +30,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { #if !DEV Fabric.with([Crashlytics.self]) #endif - - do { - try CoreStore.addStorageAndWait() - } catch { - print(error) - } // Disabled logging due errors with Swift 3 // https://github.com/Swinject/Swinject/issues/218 diff --git a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapter.swift b/ShopApp/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapter.swift deleted file mode 100644 index bb698490..00000000 --- a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapter.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// CoreDataCartProductAdapter.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import ShopApp_Gateway - -struct CoreDataCartProductAdapter { - static func adapt(product: Product?, productQuantity: Int, variant: ProductVariant?) -> CartProduct? { - guard let product = product else { - return nil - } - - let cartProduct = CartProduct() - cartProduct.productId = product.id - cartProduct.productTitle = product.title - cartProduct.productVariant = variant - cartProduct.currency = product.currency - cartProduct.quantity = productQuantity - - return cartProduct - } - - static func adapt(item: CartProductEntity?) -> CartProduct? { - guard let item = item else { - return nil - } - - let cartProduct = CartProduct() - cartProduct.productId = item.productId - cartProduct.productTitle = item.productTitle - cartProduct.productVariant = CoreDataProductVariantAdapter.adapt(item: item.productVariant) - cartProduct.currency = item.currency - cartProduct.quantity = Int(item.quantity) - - return cartProduct - } -} diff --git a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataImageAdapter.swift b/ShopApp/Data/DAO/CoreData/Adapters/CoreDataImageAdapter.swift deleted file mode 100644 index a9d35048..00000000 --- a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataImageAdapter.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// CoreDataImageAdapter.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/9/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import ShopApp_Gateway - -struct CoreDataImageAdapter { - static func adapt(item: ImageEntity?) -> Image? { - guard let item = item else { - return nil - } - - let image = Image() - image.id = item.id ?? "" - image.src = item.src - image.imageDescription = item.imageDescription - - return image - } -} diff --git a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapter.swift b/ShopApp/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapter.swift deleted file mode 100644 index e6bb5925..00000000 --- a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapter.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// CoreDataProductVariantAdapter.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/9/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import ShopApp_Gateway - -struct CoreDataProductVariantAdapter { - static func adapt(item: ProductVariantEntity?) -> ProductVariant? { - guard let item = item else { - return nil - } - - let productVariant = ProductVariant() - productVariant.id = item.id ?? "" - productVariant.price = item.price?.decimalValue - productVariant.title = item.title - productVariant.available = item.available - productVariant.image = CoreDataImageAdapter.adapt(item: item.image) - productVariant.productId = item.productId ?? "" - - productVariant.selectedOptions = item.selectedOptions?.map { - let option = VariantOption() - if let optionEntity = $0 as? VariantOptionEntity { - option.name = optionEntity.name ?? "" - option.value = optionEntity.value ?? "" - } - return option - } - - return productVariant - } -} diff --git a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapter.swift b/ShopApp/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapter.swift deleted file mode 100644 index c46e20a7..00000000 --- a/ShopApp/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapter.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// CoreDataVariantOptionAdapter.swift -// ShopApp -// -// Created by Radyslav Krechet on 1/16/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import ShopApp_Gateway - -struct CoreDataVariantOptionAdapter { - static func adapt(item: VariantOptionEntity?) -> VariantOption? { - guard let item = item else { - return nil - } - - let variantOption = VariantOption() - variantOption.name = item.name ?? "" - variantOption.value = item.value ?? "" - - return variantOption - } -} diff --git a/ShopApp/Data/DAO/CoreData/CoreDataDAO.swift b/ShopApp/Data/DAO/CoreData/CoreDataDAO.swift deleted file mode 100644 index 56751db8..00000000 --- a/ShopApp/Data/DAO/CoreData/CoreDataDAO.swift +++ /dev/null @@ -1,126 +0,0 @@ -// -// CoreDataDAO.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import CoreStore -import ShopApp_Gateway - -class CoreDataDAO: DAO { - func getCartProductList(callback: @escaping RepoCallback<[CartProduct]>) { - var cartProducts: [CartProduct] = [] - - CoreStore.perform(asynchronous: { transaction in - let items = transaction.fetchAll(From()) - - if let items = items { - cartProducts = items.map({ CoreDataCartProductAdapter.adapt(item: $0)! }) - } - }, completion: { result in - switch result { - case .success: - callback(cartProducts, nil) - case .failure(let error): - callback(nil, RepoError(with: error)) - } - }) - } - - func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) { - let predicate = getPredicate(with: cartProduct.productVariant?.id) - - CoreStore.perform(asynchronous: { transaction in - var item = transaction.fetchOne(From(), Where(predicate)) - - if item != nil { - let newQuantity = Int(item?.quantity ?? 0) + cartProduct.quantity - item?.quantity = Int64(newQuantity < kCartProductQuantityMax ? newQuantity : kCartProductQuantityMax) - } else { - item = transaction.create(Into()) - CartProductEntityUpdateService.update(item, with: cartProduct, transaction: transaction) - } - }, completion: { result in - switch result { - case .success: - callback(true, nil) - case .failure(let error): - callback(false, RepoError(with: error)) - } - }) - } - - func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) { - let predicate = getPredicate(with: productVariantId) - - CoreStore.perform(asynchronous: { transaction in - let item = transaction.fetchOne(From(), Where(predicate)) - transaction.delete(item) - }, completion: { result in - switch result { - case .success: - callback(true, nil) - case .failure(let error): - callback(false, RepoError(with: error)) - } - }) - } - - func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) { - let ids: [String] = productVariantIds.filter({ $0 != nil }).map({ $0! }) - let predicate = getPredicate(with: ids) - - CoreStore.perform(asynchronous: { transaction in - if let items = transaction.fetchAll(From(), Where(predicate)) { - transaction.delete(items) - } - }, completion: { result in - switch result { - case .success: - callback(true, nil) - case .failure(let error): - callback(false, RepoError(with: error)) - } - }) - } - - func deleteAllProductsFromCart(with callback: @escaping RepoCallback) { - CoreStore.perform(asynchronous: { transaction in - transaction.deleteAll(From()) - }, completion: { result in - switch result { - case .success: - callback(true, nil) - case .failure(let error): - callback(false, RepoError(with: error)) - } - }) - } - - func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) { - let predicate = getPredicate(with: productVariantId) - - CoreStore.perform(asynchronous: { transaction in - let item: CartProductEntity? = transaction.fetchOrCreate(predicate: predicate) - item?.quantity = Int64(quantity) - }, completion: { result in - switch result { - case .success: - callback(true, nil) - case .failure(let error): - callback(false, RepoError(with: error)) - } - }) - } - - private func getPredicate(with productVariantId: String?) -> NSPredicate { - let variantId = productVariantId ?? "" - return NSPredicate(format: "productVariant.id == %@", variantId) - } - - private func getPredicate(with productVariantsIds: [String]) -> NSPredicate { - return NSPredicate(format: "productVariant.id IN %@", productVariantsIds) - } -} diff --git a/ShopApp/Data/DAO/CoreData/Extensions/CoreStore+Transaction.swift b/ShopApp/Data/DAO/CoreData/Extensions/CoreStore+Transaction.swift deleted file mode 100644 index 87185d23..00000000 --- a/ShopApp/Data/DAO/CoreData/Extensions/CoreStore+Transaction.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// CoreStore+Transaction.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import CoreStore - -extension AsynchronousDataTransaction { - func fetchOrCreate(predicate: NSPredicate) -> T? { - var item = fetchOne(From(), Where(predicate)) - if item == nil { - item = create(Into()) - } - return item as T? - } -} diff --git a/ShopApp/Data/DAO/CoreData/Helpers/CartProductEntityUpdateService.swift b/ShopApp/Data/DAO/CoreData/Helpers/CartProductEntityUpdateService.swift deleted file mode 100644 index a7ef6e5b..00000000 --- a/ShopApp/Data/DAO/CoreData/Helpers/CartProductEntityUpdateService.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// CartProductEntityUpdateService.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import CoreStore -import ShopApp_Gateway - -struct CartProductEntityUpdateService { - static func update(_ entity: CartProductEntity?, with item: CartProduct, transaction: AsynchronousDataTransaction) { - guard let entity = entity else { - return - } - - entity.productId = item.productId - entity.productTitle = item.productTitle - entity.quantity = Int64(item.quantity) - entity.currency = item.currency - - let predicate = NSPredicate(format: "id = %@", item.productVariant?.id ?? "") - var variant = transaction.fetchOne(From(), Where(predicate)) - if variant == nil { - variant = transaction.create(Into()) - } - ProductVariantEntityUpdateService.update(variant, with: item.productVariant, transaction: transaction) - entity.productVariant = variant - } -} diff --git a/ShopApp/Data/DAO/CoreData/Helpers/ImageEntityUpdateService.swift b/ShopApp/Data/DAO/CoreData/Helpers/ImageEntityUpdateService.swift deleted file mode 100644 index 8ef244bc..00000000 --- a/ShopApp/Data/DAO/CoreData/Helpers/ImageEntityUpdateService.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// ImageEntityUpdateService.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/9/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import ShopApp_Gateway - -struct ImageEntityUpdateService { - static func update(_ entity: ImageEntity?, with item: Image?) { - guard let entity = entity else { - return - } - - entity.id = item?.id - entity.src = item?.src - entity.imageDescription = item?.imageDescription - } -} diff --git a/ShopApp/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateService.swift b/ShopApp/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateService.swift deleted file mode 100644 index 76481cb8..00000000 --- a/ShopApp/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateService.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ProductVariantEntityUpdateService.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import CoreStore -import ShopApp_Gateway - -struct ProductVariantEntityUpdateService { - static func update(_ entity: ProductVariantEntity?, with item: ProductVariant?, transaction: AsynchronousDataTransaction) { - guard let entity = entity, let item = item else { - return - } - - entity.id = item.id - entity.price = NSDecimalNumber(decimal: item.price ?? Decimal()) - entity.title = item.title - entity.available = item.available - entity.productId = item.productId - - if let selectedOptions = item.selectedOptions { - selectedOptions.forEach { - let variantOptionEntity: VariantOptionEntity = transaction.create(Into()) - VariantOptionEntityUpdateService.update(variantOptionEntity, with: $0) - entity.addToSelectedOptions(variantOptionEntity) - } - } - - if let imageItem = item.image { - let predicate = NSPredicate(format: "id = %@", imageItem.id) - let imageEntity: ImageEntity? = transaction.fetchOrCreate(predicate: predicate) - ImageEntityUpdateService.update(imageEntity, with: imageItem) - entity.image = imageEntity - } - } -} diff --git a/ShopApp/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateService.swift b/ShopApp/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateService.swift deleted file mode 100644 index 11ee8d13..00000000 --- a/ShopApp/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateService.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// VariantOptionEntityUpdateService.swift -// ShopApp -// -// Created by Radyslav Krechet on 1/16/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import ShopApp_Gateway - -struct VariantOptionEntityUpdateService { - static func update(_ entity: VariantOptionEntity, with item: VariantOption?) { - entity.name = item?.name ?? "" - entity.value = item?.value ?? "" - } -} diff --git a/ShopApp/Data/DAO/CoreData/ShopApp.xcdatamodeld/ShopApp.xcdatamodel/contents b/ShopApp/Data/DAO/CoreData/ShopApp.xcdatamodeld/ShopApp.xcdatamodel/contents deleted file mode 100644 index a95324b7..00000000 --- a/ShopApp/Data/DAO/CoreData/ShopApp.xcdatamodeld/ShopApp.xcdatamodel/contents +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ShopApp/Data/DAO/DAO.swift b/ShopApp/Data/DAO/DAO.swift deleted file mode 100644 index 97c6c454..00000000 --- a/ShopApp/Data/DAO/DAO.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// DAO.swift -// ShopApp -// -// Created by Evgeniy Antonov on 11/8/17. -// Copyright © 2017 Evgeniy Antonov. All rights reserved. -// - -import ShopApp_Gateway - -protocol DAO { - func getCartProductList(callback: @escaping RepoCallback<[CartProduct]>) - func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) - func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) - func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) - func deleteAllProductsFromCart(with callback: @escaping RepoCallback) - func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) -} diff --git a/ShopApp/Data/DI/DataAssembly.swift b/ShopApp/Data/DI/DataAssembly.swift index 72d796c6..86b0ef92 100644 --- a/ShopApp/Data/DI/DataAssembly.swift +++ b/ShopApp/Data/DI/DataAssembly.swift @@ -12,13 +12,6 @@ import ShopApp_Gateway class DataAssembly: Assembly { func assemble(container: Container) { - // MARK: - Data - - container.register(DAO.self) { _ in - return CoreDataDAO() - } - .inObjectScope(.container) - // MARK: - Repositories container.register(ArticleRepository.self) { r in @@ -32,7 +25,7 @@ class DataAssembly: Assembly { .inObjectScope(.container) container.register(CartRepository.self) { r in - return ShopAppCartRepository(dao: r.resolve(DAO.self)!) + return ShopAppCartRepository(api: r.resolve(API.self)!) } .inObjectScope(.container) diff --git a/ShopApp/Data/Repositories/ShopAppCartRepository.swift b/ShopApp/Data/Repositories/ShopAppCartRepository.swift index ca075388..af1375c9 100644 --- a/ShopApp/Data/Repositories/ShopAppCartRepository.swift +++ b/ShopApp/Data/Repositories/ShopAppCartRepository.swift @@ -9,33 +9,33 @@ import ShopApp_Gateway class ShopAppCartRepository: CartRepository { - private let dao: DAO + private let api: API - init(dao: DAO) { - self.dao = dao + init(api: API) { + self.api = api } func getCartProductList(callback: @escaping RepoCallback<[CartProduct]>) { - dao.getCartProductList(callback: callback) + api.getCartProductList(callback: callback) } func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) { - dao.addCartProduct(cartProduct: cartProduct, callback: callback) + api.addCartProduct(cartProduct: cartProduct, callback: callback) } func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) { - dao.deleteProductFromCart(with: productVariantId, callback: callback) + api.deleteProductFromCart(with: productVariantId, callback: callback) } func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) { - dao.deleteProductsFromCart(with: productVariantIds, callback: callback) + api.deleteProductsFromCart(with: productVariantIds, callback: callback) } func deleteAllProductsFromCart(with callback: @escaping RepoCallback) { - dao.deleteAllProductsFromCart(with: callback) + api.deleteAllProductsFromCart(with: callback) } func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) { - dao.changeCartProductQuantity(with: productVariantId, quantity: quantity, callback: callback) + api.changeCartProductQuantity(with: productVariantId, quantity: quantity, callback: callback) } } diff --git a/ShopAppTests/Data/API/Mocks/APIMock.swift b/ShopAppTests/Data/API/Mocks/APIMock.swift index 7bded92e..22d7f34f 100644 --- a/ShopAppTests/Data/API/Mocks/APIMock.swift +++ b/ShopAppTests/Data/API/Mocks/APIMock.swift @@ -43,6 +43,11 @@ class APIMock: API { var isGetCountriesStarted = false var isGetOrderListStarted = false var isGetOrderStarted = false + var isAddCartProductStarted = false + var isDeleteProductFromCartStarted = false + var isDeleteProductsFromCartStarted = false + var isDeleteAllProductsFromCartStarted = false + var isChangeCartProductQuantityStarted = false var perPage: Int? var paginationValue: String? var sortBy: SortingValue? @@ -67,6 +72,10 @@ class APIMock: API { var billingAddress: Address? var customerEmail: String? var ids: [String]? + var cartProduct: CartProduct? + var productVariantId: String? + var productVariantIds: [String?]? + var quantity: Int? // MARK: - Shop @@ -367,4 +376,49 @@ class APIMock: API { isNeedToReturnError ? callback(nil, RepoError()) : callback(Order(), nil) } + + // MARK: - Cart + + func getCartProductList(callback: @escaping ([CartProduct]?, RepoError?) -> Void) { + isNeedToReturnError ? callback(nil, RepoError()) : callback([], nil) + } + + func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) { + isAddCartProductStarted = true + + self.cartProduct = cartProduct + + isNeedToReturnError ? callback(false, RepoError()) : callback(true, nil) + } + + func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) { + isDeleteProductFromCartStarted = true + + self.productVariantId = productVariantId + + isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) + } + + func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) { + isDeleteProductsFromCartStarted = true + + self.productVariantIds = productVariantIds + + isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) + } + + func deleteAllProductsFromCart(with callback: @escaping RepoCallback) { + isDeleteAllProductsFromCartStarted = true + + isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) + } + + func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) { + isChangeCartProductQuantityStarted = true + + self.productVariantId = productVariantId + self.quantity = quantity + + isNeedToReturnError ? callback(false, RepoError()) : callback(true, nil) + } } diff --git a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapterSpec.swift b/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapterSpec.swift deleted file mode 100644 index 7fc80a2f..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataCartProductAdapterSpec.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// CoreDataCartProductAdapterSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreDataCartProductAdapterSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when adapter used") { - it("needs to adapt entity item to model object") { - let productVariantDescription = NSEntityDescription.entity(forEntityName: "ProductVariantEntity", in: managedObjectContext)! - let cartProductDescription = NSEntityDescription.entity(forEntityName: "CartProductEntity", in: managedObjectContext)! - - let productVariant = ProductVariantEntity(entity: productVariantDescription, insertInto: nil) - productVariant.id = "id" - - let item = CartProductEntity(entity: cartProductDescription, insertInto: nil) - item.productId = "productId" - item.productTitle = "title" - item.productVariant = productVariant - item.currency = "currency" - item.quantity = 5 - - let object = CoreDataCartProductAdapter.adapt(item: item)! - - expect(object.productId) == item.productId - expect(object.productTitle) == item.productTitle - expect(object.productVariant?.id) == item.productVariant?.id - expect(object.currency) == item.currency - expect(object.quantity) == Int(item.quantity) - } - - it("needs to adapt model objects th other one") { - let productQuantity = 5 - - let product = Product() - product.id = "id" - product.title = "title" - product.currency = "currency" - - let productVariant = ProductVariant() - productVariant.id = "productVariantId" - - let object = CoreDataCartProductAdapter.adapt(product: product, productQuantity: productQuantity, variant: productVariant)! - - expect(object.productId) == product.id - expect(object.productTitle) == product.title - expect(object.productVariant?.id) == productVariant.id - expect(object.currency) == product.currency - expect(object.quantity) == productQuantity - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataImageAdapterSpec.swift b/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataImageAdapterSpec.swift deleted file mode 100644 index c917904b..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataImageAdapterSpec.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// CoreDataImageAdapterSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreDataImageAdapterSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when adapter used") { - it("needs to adapt entity item to model object") { - let description = NSEntityDescription.entity(forEntityName: "ImageEntity", in: managedObjectContext)! - - let item = ImageEntity(entity: description, insertInto: nil) - item.id = "id" - item.src = "src" - item.imageDescription = "description" - - let object = CoreDataImageAdapter.adapt(item: item)! - - expect(object.id) == item.id - expect(object.src) == item.src - expect(object.imageDescription) == item.imageDescription - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapterSpec.swift b/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapterSpec.swift deleted file mode 100644 index 44d15162..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataProductVariantAdapterSpec.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// CoreDataProductVariantAdapterSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreDataProductVariantAdapterSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when adapter used") { - it("needs to adapt entity item to model object") { - let imageDescription = NSEntityDescription.entity(forEntityName: "ImageEntity", in: managedObjectContext)! - let variantOptionDescription = NSEntityDescription.entity(forEntityName: "VariantOptionEntity", in: managedObjectContext)! - let productVariantDescription = NSEntityDescription.entity(forEntityName: "ProductVariantEntity", in: managedObjectContext)! - - let image = ImageEntity(entity: imageDescription, insertInto: nil) - image.id = "id" - - let variantOption = VariantOptionEntity(entity: variantOptionDescription, insertInto: nil) - variantOption.name = "name" - - let item = ProductVariantEntity(entity: productVariantDescription, insertInto: nil) - item.id = "id" - item.price = 5.5 - item.title = "title" - item.available = true - item.image = image - item.productId = "productId" - item.addToSelectedOptions(variantOption) - - let object = CoreDataProductVariantAdapter.adapt(item: item)! - - expect(object.id) == item.id - expect(object.price) == item.price?.decimalValue - expect(object.title) == item.title - expect(object.available) == item.available - expect(object.image?.id) == item.image?.id - expect(object.productId) == item.productId - expect(object.selectedOptions?.first?.name) == (item.selectedOptions?.allObjects.first as? VariantOptionEntity)?.name - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapterSpec.swift b/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapterSpec.swift deleted file mode 100644 index 294e4346..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Adapters/CoreDataVariantOptionAdapterSpec.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// CoreDataVariantOptionAdapterSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreDataVariantOptionAdapterSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when adapter used") { - it("needs to adapt entity item to model object") { - let description = NSEntityDescription.entity(forEntityName: "VariantOptionEntity", in: managedObjectContext)! - - let item = VariantOptionEntity(entity: description, insertInto: nil) - item.name = "name" - item.value = "value" - - let object = CoreDataVariantOptionAdapter.adapt(item: item)! - - expect(object.name) == item.name - expect(object.value) == item.value - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/CoreDataDAOSpec.swift b/ShopAppTests/Data/DAO/CoreData/CoreDataDAOSpec.swift deleted file mode 100644 index 83b52a6f..00000000 --- a/ShopAppTests/Data/DAO/CoreData/CoreDataDAOSpec.swift +++ /dev/null @@ -1,209 +0,0 @@ -// -// CoreDataDAOSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/30/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import CoreStore -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreDataDAOSpec: QuickSpec { - override func spec() { - var dao: DAO! - - beforeEach { - dao = CoreDataDAO() - - let inMemoryStore = InMemoryStore() - try! CoreStore.addStorageAndWait(inMemoryStore) - } - - describe("when cart product list should be get") { - it("needs to fetch and return all adapted entities") { - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - transaction.create(Into()) - }, completion: { _ in - dao.getCartProductList() { (result, _) in - expect(result?.count) == 1 - - done() - } - }) - } - } - } - - describe("when cart product should be add") { - var cartProduct: CartProduct! - - beforeEach { - let productVariant = ProductVariant() - productVariant.id = "id" - - cartProduct = CartProduct() - cartProduct.productId = "id" - cartProduct.quantity = 1 - cartProduct.productVariant = productVariant - } - - context("if there is no entity with identifier") { - it("needs to create new entity") { - waitUntil(timeout: 10) { done in - dao.addCartProduct(cartProduct: cartProduct) { (_, _) in - var numberOfEntities: Int? - - CoreStore.perform(asynchronous: { transaction in - numberOfEntities = transaction.fetchCount(From()) - }, completion: { _ in - expect(numberOfEntities) == 1 - - done() - }) - } - } - } - } - - context("if there is one entity with identifier") { - it("needs to fetch entity and update them quantity") { - waitUntil(timeout: 10) { done in - dao.addCartProduct(cartProduct: cartProduct) { (_, _) in - dao.addCartProduct(cartProduct: cartProduct) { (_, _) in - var entities: [CartProductEntity]? - - CoreStore.perform(asynchronous: { transaction in - entities = transaction.fetchAll(From()) - }, completion: { _ in - expect(entities?.count) == 1 - expect(entities?.first?.quantity) == 2 - - done() - }) - } - } - } - } - } - } - - describe("when cart product should be delete") { - it("needs to delete selected entity") { - let productVariantId = "id" - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - let entity = transaction.create(Into()) - entity.productVariant = transaction.create(Into()) - entity.productVariant?.id = productVariantId - }, completion: { _ in - dao.deleteProductFromCart(with: productVariantId) { (_, _) in - var numberOfEntities: Int? - - CoreStore.perform(asynchronous: { transaction in - numberOfEntities = transaction.fetchCount(From()) - }, completion: { _ in - expect(numberOfEntities) == 0 - - done() - }) - } - }) - } - } - } - - describe("when cart products by ids should be delete") { - it("should delete selected entities") { - let productVariantId = "id1" - let productVariantToDeleteId = "id2" - let allProductVariantIds = [productVariantId, productVariantToDeleteId] - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - allProductVariantIds.forEach({ - let entity = transaction.create(Into()) - entity.productVariant = transaction.create(Into()) - entity.productVariant?.id = $0 - }) - }, completion: { _ in - dao.deleteProductsFromCart(with: [productVariantToDeleteId]) { (_, _) in - var numberOfEntities: Int? - var existProductVariantIds: [String?]? - - CoreStore.perform(asynchronous: { transaction in - numberOfEntities = transaction.fetchCount(From()) - let all = transaction.fetchAll(From()) - existProductVariantIds = all?.map({ $0.productVariant?.id }) - }, completion: { _ in - expect(numberOfEntities) == 1 - expect(existProductVariantIds).to(equal([productVariantId])) - - done() - }) - } - }) - } - } - } - - describe("when all cart products should be delete") { - it("needs to delete all entities") { - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - _ = transaction.create(Into()) - _ = transaction.create(Into()) - }, completion: { _ in - dao.deleteAllProductsFromCart() { (_, _) in - var numberOfEntities: Int? - - CoreStore.perform(asynchronous: { transaction in - numberOfEntities = transaction.fetchCount(From()) - }, completion: { _ in - expect(numberOfEntities) == 0 - - done() - }) - } - }) - } - } - } - - describe("when cart product's quantity should be change") { - it("needs to change value") { - let productVariantId = "id" - let quantity = 2 - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - let entity = transaction.create(Into()) - entity.productVariant = transaction.create(Into()) - entity.productVariant?.id = productVariantId - entity.quantity = 1 - }, completion: { _ in - dao.changeCartProductQuantity(with: productVariantId, quantity: quantity) { (_, _) in - var entity: CartProductEntity? - - CoreStore.perform(asynchronous: { transaction in - entity = transaction.fetchOne(From()) - }, completion: { _ in - expect(entity?.quantity) == Int64(quantity) - - done() - }) - } - }) - } - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/CoreDataTestHelper.swift b/ShopAppTests/Data/DAO/CoreData/CoreDataTestHelper.swift deleted file mode 100644 index 6ae697b3..00000000 --- a/ShopAppTests/Data/DAO/CoreData/CoreDataTestHelper.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// CoreDataTestHelper.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -class CoreDataTestHelper { - lazy var managedObjectContext: NSManagedObjectContext = { - let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])! - let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel) - - try! persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil) - - let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) - managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator - - return managedObjectContext - }() -} diff --git a/ShopAppTests/Data/DAO/CoreData/Extensions/CoreStore+TransactionSpec.swift b/ShopAppTests/Data/DAO/CoreData/Extensions/CoreStore+TransactionSpec.swift deleted file mode 100644 index ea0ebf1c..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Extensions/CoreStore+TransactionSpec.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// CoreStore+TransactionSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/30/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import CoreStore -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CoreStore_TransactionSpec: QuickSpec { - override func spec() { - beforeEach { - let inMemoryStore = InMemoryStore() - try! CoreStore.addStorageAndWait(inMemoryStore) - } - - describe("when extention's func used") { - context("if entity was created") { - it("needs to return fetched entity") { - let id = "id" - let predicate = NSPredicate(format: "productId == %@", id) - - var entity: CartProductEntity? - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - entity = transaction.create(Into()) - entity?.productId = "productId" - - entity = transaction.fetchOrCreate(predicate: predicate) - entity?.productId = id - }, completion: { _ in - expect(entity?.productId) == id - - done() - }) - } - } - } - - context("if entity wasn't created") { - it("needs to create a new entity and return it") { - let id = "id" - let predicate = NSPredicate(format: "productId == %@", id) - - var entity: CartProductEntity? - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - entity = transaction.fetchOrCreate(predicate: predicate) - entity?.productId = id - }, completion: { _ in - expect(entity?.productId) == id - - done() - }) - } - } - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Helpers/CartProductEntityUpdateServiceSpec.swift b/ShopAppTests/Data/DAO/CoreData/Helpers/CartProductEntityUpdateServiceSpec.swift deleted file mode 100644 index 2b4501a1..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Helpers/CartProductEntityUpdateServiceSpec.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// CartProductEntityUpdateServiceSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import CoreStore -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class CartProductEntityUpdateServiceSpec: QuickSpec { - override func spec() { - beforeEach { - let inMemoryStore = InMemoryStore() - try! CoreStore.addStorageAndWait(inMemoryStore) - } - - describe("when update service used") { - it("needs to update entity with item") { - let productVariant = ProductVariant() - productVariant.id = "id" - - let item = CartProduct() - item.productId = "id" - item.productTitle = "title" - item.quantity = 5 - item.currency = "currency" - item.productVariant = productVariant - - var entity: CartProductEntity! - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - entity = transaction.create(Into()) - - CartProductEntityUpdateService.update(entity, with: item, transaction: transaction) - }, completion: { _ in - expect(entity.productId) == item.productId - expect(entity.productTitle) == item.productTitle - expect(entity.quantity) == Int64(item.quantity) - expect(entity.currency) == item.currency - expect(entity.productVariant?.id) == productVariant.id - - done() - }) - } - } - } - } -} - diff --git a/ShopAppTests/Data/DAO/CoreData/Helpers/ImageEntityUpdateServiceSpec.swift b/ShopAppTests/Data/DAO/CoreData/Helpers/ImageEntityUpdateServiceSpec.swift deleted file mode 100644 index 1b7e8bad..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Helpers/ImageEntityUpdateServiceSpec.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// ImageEntityUpdateServiceSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class ImageEntityUpdateServiceSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when update service used") { - it("needs to update entity with item") { - let description = NSEntityDescription.entity(forEntityName: "ImageEntity", in: managedObjectContext)! - let entity = ImageEntity(entity: description, insertInto: nil) - - let item = Image() - item.id = "id" - item.src = "src" - item.imageDescription = "imageDescription" - - ImageEntityUpdateService.update(entity, with: item) - - expect(entity.id) == item.id - expect(entity.src) == item.src - expect(entity.imageDescription) == item.imageDescription - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateServiceSpec.swift b/ShopAppTests/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateServiceSpec.swift deleted file mode 100644 index b4f384c1..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Helpers/ProductVariantEntityUpdateServiceSpec.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// ProductVariantEntityUpdateServiceSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import CoreStore -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class ProductVariantEntityUpdateServiceSpec: QuickSpec { - override func spec() { - beforeEach { - let inMemoryStore = InMemoryStore() - try! CoreStore.addStorageAndWait(inMemoryStore) - } - - describe("when update service used") { - it("needs to update entity with item") { - let variantOption = VariantOption() - variantOption.name = "name" - - let image = Image() - image.id = "id" - image.src = "src" - - let item = ProductVariant() - item.id = "id" - item.price = 5.5 - item.title = "title" - item.available = true - item.productId = "productId" - item.selectedOptions = [variantOption] - item.image = image - - var entity: ProductVariantEntity! - - waitUntil(timeout: 10) { done in - CoreStore.perform(asynchronous: { transaction in - entity = transaction.create(Into()) - - ProductVariantEntityUpdateService.update(entity, with: item, transaction: transaction) - }, completion: { _ in - expect(entity.id) == item.id - expect(entity.price) == NSDecimalNumber(decimal: item.price ?? Decimal()) - expect(entity.title) == item.title - expect(entity.available) == item.available - expect(entity.productId) == item.productId - expect((entity.selectedOptions?.allObjects.first as? VariantOptionEntity)?.name) == variantOption.name - expect(entity.image?.id) == image.id - - done() - }) - } - } - } - } -} diff --git a/ShopAppTests/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateServiceSpec.swift b/ShopAppTests/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateServiceSpec.swift deleted file mode 100644 index b9e14119..00000000 --- a/ShopAppTests/Data/DAO/CoreData/Helpers/VariantOptionEntityUpdateServiceSpec.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// VariantOptionEntityUpdateServiceSpec.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/29/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import CoreData - -import Nimble -import Quick -import ShopApp_Gateway - -@testable import ShopApp - -class VariantOptionEntityUpdateServiceSpec: QuickSpec { - override func spec() { - var managedObjectContext: NSManagedObjectContext! - - beforeEach { - let coreDataTestHelper = CoreDataTestHelper() - managedObjectContext = coreDataTestHelper.managedObjectContext - } - - describe("when update service used") { - it("needs to update entity with item") { - let description = NSEntityDescription.entity(forEntityName: "VariantOptionEntity", in: managedObjectContext)! - let entity = VariantOptionEntity(entity: description, insertInto: nil) - - let item = VariantOption() - item.name = "name" - item.value = "value" - - VariantOptionEntityUpdateService.update(entity, with: item) - - expect(entity.name) == item.name - expect(entity.value) == item.value - } - } - } -} diff --git a/ShopAppTests/Data/DAO/Mocks/DAOMock.swift b/ShopAppTests/Data/DAO/Mocks/DAOMock.swift deleted file mode 100644 index 45a52bca..00000000 --- a/ShopAppTests/Data/DAO/Mocks/DAOMock.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// DAOMock.swift -// ShopAppTests -// -// Created by Radyslav Krechet on 3/28/18. -// Copyright © 2018 RubyGarage. All rights reserved. -// - -import ShopApp_Gateway - -@testable import ShopApp - -class DAOMock: DAO { - var isNeedToReturnError = false - var isAddCartProductStarted = false - var isDeleteProductFromCartStarted = false - var isDeleteProductsFromCartStarted = false - var isDeleteAllProductsFromCartStarted = false - var isChangeCartProductQuantityStarted = false - var cartProduct: CartProduct? - var productVariantId: String? - var productVariantIds: [String?]? - var quantity: Int? - - func getCartProductList(callback: @escaping ([CartProduct]?, RepoError?) -> Void) { - isNeedToReturnError ? callback(nil, RepoError()) : callback([], nil) - } - - func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) { - isAddCartProductStarted = true - - self.cartProduct = cartProduct - - isNeedToReturnError ? callback(false, RepoError()) : callback(true, nil) - } - - func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) { - isDeleteProductFromCartStarted = true - - self.productVariantId = productVariantId - - isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) - } - - func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) { - isDeleteProductsFromCartStarted = true - - self.productVariantIds = productVariantIds - - isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) - } - - func deleteAllProductsFromCart(with callback: @escaping RepoCallback) { - isDeleteAllProductsFromCartStarted = true - - isNeedToReturnError ? callback(nil, RepoError()) : callback(true, nil) - } - - func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) { - isChangeCartProductQuantityStarted = true - - self.productVariantId = productVariantId - self.quantity = quantity - - isNeedToReturnError ? callback(false, RepoError()) : callback(true, nil) - } -} diff --git a/ShopAppTests/Data/Repositories/ShopAppCartRepositorySpec.swift b/ShopAppTests/Data/Repositories/ShopAppCartRepositorySpec.swift index 720f0c21..27f361ba 100644 --- a/ShopAppTests/Data/Repositories/ShopAppCartRepositorySpec.swift +++ b/ShopAppTests/Data/Repositories/ShopAppCartRepositorySpec.swift @@ -15,17 +15,17 @@ import ShopApp_Gateway class ShopAppCartRepositorySpec: QuickSpec { override func spec() { var repository: ShopAppCartRepository! - var daoMock: DAOMock! + var apiMock: APIMock! beforeEach { - daoMock = DAOMock() - repository = ShopAppCartRepository(dao: daoMock) + apiMock = APIMock() + repository = ShopAppCartRepository(api: apiMock) } describe("when cart product list should be get") { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.getCartProductList() { (list, error) in expect(list).toNot(beNil()) @@ -36,7 +36,7 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.getCartProductList() { (list, error) in expect(list).to(beNil()) @@ -55,12 +55,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.addCartProduct(cartProduct: cartProduct) { (result, error) in - expect(daoMock.isAddCartProductStarted) == true + expect(apiMock.isAddCartProductStarted) == true - expect(daoMock.cartProduct) === cartProduct + expect(apiMock.cartProduct) === cartProduct expect(result) == true expect(error).to(beNil()) @@ -70,12 +70,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.addCartProduct(cartProduct: cartProduct) { (result, error) in - expect(daoMock.isAddCartProductStarted) == true + expect(apiMock.isAddCartProductStarted) == true - expect(daoMock.cartProduct) === cartProduct + expect(apiMock.cartProduct) === cartProduct expect(result) == false expect(error).toNot(beNil()) @@ -93,12 +93,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.deleteProductFromCart(with: productVariantId) { (result, error) in - expect(daoMock.isDeleteProductFromCartStarted) == true + expect(apiMock.isDeleteProductFromCartStarted) == true - expect(daoMock.productVariantId) == productVariantId + expect(apiMock.productVariantId) == productVariantId expect(result).toNot(beNil()) expect(error).to(beNil()) @@ -108,12 +108,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.deleteProductFromCart(with: productVariantId) { (result, error) in - expect(daoMock.isDeleteProductFromCartStarted) == true + expect(apiMock.isDeleteProductFromCartStarted) == true - expect(daoMock.productVariantId) == productVariantId + expect(apiMock.productVariantId) == productVariantId expect(result).to(beNil()) expect(error).toNot(beNil()) @@ -131,12 +131,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.deleteProductsFromCart(with: productVariantIds) { (result, error) in - expect(daoMock.isDeleteProductsFromCartStarted) == true + expect(apiMock.isDeleteProductsFromCartStarted) == true - expect(daoMock.productVariantIds).to(equal(productVariantIds)) + expect(apiMock.productVariantIds).to(equal(productVariantIds)) expect(result).toNot(beNil()) expect(error).to(beNil()) @@ -146,12 +146,12 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.deleteProductsFromCart(with: productVariantIds) { (result, error) in - expect(daoMock.isDeleteProductsFromCartStarted) == true + expect(apiMock.isDeleteProductsFromCartStarted) == true - expect(daoMock.productVariantIds).to(equal(productVariantIds)) + expect(apiMock.productVariantIds).to(equal(productVariantIds)) expect(result).to(beNil()) expect(error).toNot(beNil()) @@ -163,10 +163,10 @@ class ShopAppCartRepositorySpec: QuickSpec { describe("when all cart products should be delete") { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.deleteAllProductsFromCart() { (result, error) in - expect(daoMock.isDeleteAllProductsFromCartStarted) == true + expect(apiMock.isDeleteAllProductsFromCartStarted) == true expect(result).toNot(beNil()) expect(error).to(beNil()) @@ -176,10 +176,10 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.deleteAllProductsFromCart() { (result, error) in - expect(daoMock.isDeleteAllProductsFromCartStarted) == true + expect(apiMock.isDeleteAllProductsFromCartStarted) == true expect(result).to(beNil()) expect(error).toNot(beNil()) @@ -199,13 +199,13 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has result") { it("needs to handle result") { - daoMock.isNeedToReturnError = false + apiMock.isNeedToReturnError = false repository.changeCartProductQuantity(with: productVariantId, quantity: quantity) { (result, error) in - expect(daoMock.isChangeCartProductQuantityStarted) == true + expect(apiMock.isChangeCartProductQuantityStarted) == true - expect(daoMock.productVariantId) == productVariantId - expect(daoMock.quantity) == quantity + expect(apiMock.productVariantId) == productVariantId + expect(apiMock.quantity) == quantity expect(result) == true expect(error).to(beNil()) @@ -215,13 +215,13 @@ class ShopAppCartRepositorySpec: QuickSpec { context("if callback has error") { it("needs to handle error") { - daoMock.isNeedToReturnError = true + apiMock.isNeedToReturnError = true repository.changeCartProductQuantity(with: productVariantId, quantity: quantity) { (result, error) in - expect(daoMock.isChangeCartProductQuantityStarted) == true + expect(apiMock.isChangeCartProductQuantityStarted) == true - expect(daoMock.productVariantId) == productVariantId - expect(daoMock.quantity) == quantity + expect(apiMock.productVariantId) == productVariantId + expect(apiMock.quantity) == quantity expect(result) == false expect(error).toNot(beNil()) diff --git a/ShopApp_Gateway/API.swift b/ShopApp_Gateway/API.swift index 775d44fb..5ae8aef8 100644 --- a/ShopApp_Gateway/API.swift +++ b/ShopApp_Gateway/API.swift @@ -65,4 +65,13 @@ public protocol API { func getOrderList(perPage: Int, paginationValue: Any?, callback: @escaping RepoCallback<[Order]>) func getOrder(id: String, callback: @escaping RepoCallback) + + // MARK: - Cart + + func getCartProductList(callback: @escaping RepoCallback<[CartProduct]>) + func addCartProduct(cartProduct: CartProduct, callback: @escaping RepoCallback) + func deleteProductFromCart(with productVariantId: String?, callback: @escaping RepoCallback) + func deleteProductsFromCart(with productVariantIds: [String?], callback: @escaping RepoCallback) + func deleteAllProductsFromCart(with callback: @escaping RepoCallback) + func changeCartProductQuantity(with productVariantId: String?, quantity: Int, callback: @escaping RepoCallback) } diff --git a/ShopApp_Gateway/Adapters/CartProductAdapter.swift b/ShopApp_Gateway/Adapters/CartProductAdapter.swift new file mode 100644 index 00000000..637ba64f --- /dev/null +++ b/ShopApp_Gateway/Adapters/CartProductAdapter.swift @@ -0,0 +1,26 @@ +// +// CartProductAdapter.swift +// ShopApp +// +// Created by Evgeniy Antonov on 11/8/17. +// Copyright © 2017 Evgeniy Antonov. All rights reserved. +// + +import Foundation + +public struct CartProductAdapter { + public static func adapt(product: Product?, productQuantity: Int, variant: ProductVariant?) -> CartProduct? { + guard let product = product else { + return nil + } + + let cartProduct = CartProduct() + cartProduct.productId = product.id + cartProduct.productTitle = product.title + cartProduct.productVariant = variant + cartProduct.currency = product.currency + cartProduct.quantity = productQuantity + + return cartProduct + } +}