Skip to content

Commit

Permalink
feat(GiniHealthSDK): Fix sorting and add unit tests for sorting payme…
Browse files Browse the repository at this point in the history
…nt providers

IPC-231
  • Loading branch information
razvancapra committed Apr 9, 2024
1 parent 00922cf commit 9bd5806
Show file tree
Hide file tree
Showing 9 changed files with 405 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,6 @@ extension String {
func toColor() -> UIColor? {
return UIColor(hex: String.rgbaHexFrom(rgbHex: self))
}

func canOpenURLString() -> Bool {
if let url = URL(string: self) {
if UIApplication.shared.canOpenURL(url) {
return true
}
}
return false
}
}

public extension String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,12 @@ final class BanksBottomViewModel {
let descriptionLabelAccentColor: UIColor = GiniColor(lightModeColor: UIColor.GiniHealthColors.dark3,
darkModeColor: UIColor.GiniHealthColors.light3).uiColor()
var descriptionLabelFont: UIFont

private var urlOpener: URLOpener

init(paymentProviders: PaymentProviders, selectedPaymentProvider: PaymentProvider?) {
init(paymentProviders: PaymentProviders, selectedPaymentProvider: PaymentProvider?, urlOpener: URLOpener = URLOpener(UIApplication.shared)) {
self.selectedPaymentProvider = selectedPaymentProvider
self.urlOpener = urlOpener

let defaultRegularFont: UIFont = UIFont.systemFont(ofSize: 14, weight: .regular)
let defaultBoldFont: UIFont = UIFont.systemFont(ofSize: 14, weight: .bold)
Expand All @@ -67,8 +70,7 @@ final class BanksBottomViewModel {
.map({ PaymentProviderAdditionalInfo(isSelected: $0.id == selectedPaymentProvider?.id,
isInstalled: isPaymentProviderInstalled(paymentProvider: $0),
paymentProvider: $0)})
self.paymentProviders.sort { isPaymentProviderInstalled(paymentProvider: $0.paymentProvider) && !isPaymentProviderInstalled(paymentProvider: $1.paymentProvider) }

.sorted(by: { $0.isInstalled && !$1.isInstalled })
self.calculateHeights()
}

Expand All @@ -93,7 +95,10 @@ final class BanksBottomViewModel {
}

private func isPaymentProviderInstalled(paymentProvider: PaymentProvider) -> Bool {
paymentProvider.appSchemeIOS.canOpenURLString()
if let urlAppScheme = URL(string: paymentProvider.appSchemeIOS) {
return urlOpener.canOpenLink(url: urlAppScheme)
}
return false
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ final class PaymentInfoViewModel {

init(paymentProviders: PaymentProviders) {
self.paymentProviders = paymentProviders
.filter({ $0.appStoreUrlIOS != nil || $0.appStoreUrlIOS?.canOpenURLString() ?? false })

let giniHealthConfiguration = GiniHealthConfiguration.shared

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public struct URLOpener {
completion?(false)
}
}

func canOpenLink(url: URL) -> Bool {
application.canOpenURL(url)
}
}

public protocol URLOpenerProtocol {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ struct MockUIApplication: URLOpenerProtocol {
var canOpen: Bool

func canOpenURL(_ url: URL) -> Bool {
return canOpen
switch url.absoluteString {
case "ginipay-bank://", "ginipay-ingdiba://":
// In tests we "open" Gini-Test-Payment-Provider and ING-DiBa
return true
default:
return canOpen
}
}

func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any], completionHandler completion: ((Bool) -> Void)?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ func loadProvidersResponse() -> [PaymentProviderResponse] {
return (try? JSONDecoder().decode([PaymentProviderResponse].self, from: jsonData!))!
}

func loadProviders() -> PaymentProviders {
func loadProviders(fileName: String = "providers") -> PaymentProviders {
var providers: PaymentProviders = []
let fileURLPath: String? = Bundle.module
.path(forResource: "providers", ofType: "json")
.path(forResource: fileName, ofType: "json")
let jsonData = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))
let providersResponse = try! JSONDecoder().decode([PaymentProviderResponse].self, from: jsonData!)
for providerResponse in providersResponse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,15 @@ final class PaymentComponentsControllerTests: XCTestCase {
let paymentInfoViewModel = paymentInfoVC.viewModel!
XCTAssertEqual(paymentInfoViewModel.paymentProviders, [])
}

func testPaymentProvidersSorting() {
let givenPaymentProviders = loadProviders(fileName: "notSortedBanks")

let expectedPaymentProviders = loadProviders(fileName: "sortedBanks")

let bottomViewModel = BanksBottomViewModel(paymentProviders: givenPaymentProviders, selectedPaymentProvider: nil, urlOpener: URLOpener(MockUIApplication(canOpen: false)))

XCTAssertEqual(bottomViewModel.paymentProviders.count, 11)
XCTAssertEqual(bottomViewModel.paymentProviders.map { $0.paymentProvider }, expectedPaymentProviders)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
[
{
"id": "f7d06ee0-51fd-11ec-8216-97f0937beb16",
"name": "GiniBank",
"appSchemeIOS": "ginipay-ginibank://",
"packageNameAndroid": "net.gini.android.bank.sdk.ginibank",
"minAppVersion": {
"ios": "1.2.3",
"android": "4.5.6"
},
"colors": {
"background": "FFFFFF",
"text": "009EDC"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/f7d06ee0-51fd-11ec-8216-97f0937beb16/icon",
"universalLinkIOS": "ginipay-ginibank://"
},
{
"id": "0bd58eae-7ea2-11ec-8a88-8fbe75353d94",
"name": "ConsorsbankMock",
"appSchemeIOS": "ginipay-consorsbank-mock://",
"packageNameAndroid": "de.consorsbank.bankingapp",
"minAppVersion": {
"ios": "1.2.3",
"android": "4.5.6"
},
"colors": {
"background": "4DBED3",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/0bd58eae-7ea2-11ec-8a88-8fbe75353d94/icon",
"universalLinkIOS": "ginipay-consorsbank-mock://"
},
{
"id": "f2d2f9a6-8e4a-11ec-97e4-e372f4cd98db",
"name": "Consorsbank Test",
"appSchemeIOS": "ginipay-consorsbanktest://",
"packageNameAndroid": "de.consorsbank.test",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "0080A6",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/f2d2f9a6-8e4a-11ec-97e4-e372f4cd98db/icon",
"universalLinkIOS": "ginipay-consorsbanktest://"
},
{
"id": "d5a56d26-8e4c-11ec-9c27-5b350ade3856",
"name": "Consorsbank Dev",
"appSchemeIOS": "ginipay-consorsbankdebug://",
"packageNameAndroid": "de.consorsbank.debug",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "0080A6",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/d5a56d26-8e4c-11ec-9c27-5b350ade3856/icon",
"universalLinkIOS": "ginipay-consorsbankdebug://"
},
{
"id": "f2e66ede-57be-43d9-b483-5c746220c594",
"name": "Bank",
"appSchemeIOS": "ginipay-insurance-bank-mock://",
"packageNameAndroid": "net.gini.android.bank.insurance.mock",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "003FE2",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/f2e66ede-57be-43d9-b483-5c746220c594/icon",
"appStoreUrlIOS": "https://testflight.apple.com/join/BTe3AH8w",
"playStoreUrlAndroid": "https://install.appcenter.ms/orgs/gini-team-organization/apps/bank-1/distribution_groups/internal",
"universalLinkIOS": "ginipay-insurance-bank-mock://"
},
{
"id": "dbe3a2ca-c9df-11eb-a1d8-a7efff6e88b7",
"name": "ING-DiBa",
"appSchemeIOS": "ginipay-ingdiba://",
"packageNameAndroid": "de.ingdiba.bankingapp",
"minAppVersion": {
"ios": "??.?",
"android": "??.?"
},
"colors": {
"background": "daa520",
"text": "54f1db"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/dbe3a2ca-c9df-11eb-a1d8-a7efff6e88b7/icon",
"universalLinkIOS": "ginipay-ingdiba://"
},
{
"id": "a65b0646-51fe-11ec-8736-c338396b2f09",
"name": "Consorsbank",
"appSchemeIOS": "ginipay-consorsbank://",
"packageNameAndroid": "de.consorsbank",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "0080A6",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/a65b0646-51fe-11ec-8736-c338396b2f09/icon",
"appStoreUrlIOS": "https://apps.apple.com/de/app/consorsbank/id930883278",
"playStoreUrlAndroid": "https://play.google.com/store/apps/details?id=de.consorsbank",
"universalLinkIOS": "ginipay-consorsbank://"
},
{
"id": "03e8f20c-8e4d-11ec-a97f-5f81b1fbfee4",
"name": "BNP Paribas myPrivateBank",
"appSchemeIOS": "ginipay-cbwm://",
"packageNameAndroid": "de.bnp.wm",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "01975E",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/03e8f20c-8e4d-11ec-a97f-5f81b1fbfee4/icon",
"appStoreUrlIOS": "https://apps.apple.com/de/app/myprivatebank/id1115169520",
"playStoreUrlAndroid": "https://play.google.com/store/apps/details?id=de.bnp.wm",
"universalLinkIOS": "ginipay-cbwm://"
},
{
"id": "43119f92-8e4d-11ec-861f-c75b8eeceadc",
"name": "BNP Paribas myPrivateBank Dev",
"appSchemeIOS": "ginipay-cbwmdebug://",
"packageNameAndroid": "de.bnp.wm.debug",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "01975E",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/43119f92-8e4d-11ec-861f-c75b8eeceadc/icon",
"universalLinkIOS": "ginipay-cbwmdebug://"
},
{
"id": "72e3b804-8e4d-11ec-be15-9bfa6d461196",
"name": "BNP Paribas myPrivateBank Test",
"appSchemeIOS": "ginipay-cbwmtest://",
"packageNameAndroid": "de.bnp.wm.test",
"minAppVersion": {
"ios": "1.0.0",
"android": "1.0.0"
},
"colors": {
"background": "01975E",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/72e3b804-8e4d-11ec-be15-9bfa6d461196/icon",
"universalLinkIOS": "ginipay-cbwmtest://"
},
{
"id": "b09ef70a-490f-11eb-952e-9bc6f4646c57",
"name": "Gini-Test-Payment-Provider",
"appSchemeIOS": "ginipay-bank://",
"packageNameAndroid": "net.gini.android.bank.sdk.exampleapp",
"minAppVersion": {
"ios": "??.?",
"android": "??.?"
},
"colors": {
"background": "009EDC",
"text": "FFFFFF"
},
"iconLocation": "https://health-api.gini.net/paymentProviders/b09ef70a-490f-11eb-952e-9bc6f4646c57/icon",
"appStoreUrlIOS": "https://apps.apple.com/de/app/bank/id1234567890",
"playStoreUrlAndroid": "https://play.google.com/store/apps/details?id=net.gini.android.bank.insurance.mock",
"universalLinkIOS": "ginipay-bank://"
}
]
Loading

0 comments on commit 9bd5806

Please sign in to comment.