Skip to content

Commit

Permalink
feat(cozy-harvest-lib): Exclude konnectors in maintenance from paywalls
Browse files Browse the repository at this point in the history
To display the paywall, we only check the number of accounts for connectors that are not under maintenance.
  • Loading branch information
cballevre committed Oct 25, 2023
1 parent d475597 commit f0f0fcd
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 3 deletions.
24 changes: 22 additions & 2 deletions packages/cozy-harvest-lib/src/helpers/accounts.js
Expand Up @@ -9,7 +9,10 @@ import {
hasReachMaxAccounts
} from '../components/AccountsPaywall/helpers'
import { fetchAccount } from '../connections/accounts'
import { buildCountTriggersQuery } from '../helpers/queries'
import {
buildCountTriggersQuery,
buildAppsRegistryMaintenance
} from '../helpers/queries'
import * as triggersModel from '../helpers/triggers'

const DEFAULT_TWOFA_CODE_PROVIDER_TYPE = 'default'
Expand Down Expand Up @@ -259,10 +262,27 @@ export const checkMaxAccounts = async (slug, client) => {
triggersQuery
)

if (hasReachMaxAccounts(triggers.length)) {
const maintenanceQuery = buildAppsRegistryMaintenance()
const { data: maintenance } = await client.fetchQueryAndGetFromState(
maintenanceQuery
)

const slugInMaintenance = maintenance.map(app =>
app.maintenance_activated ? app.slug : null
)

const activeTrigger = triggers.filter(
trigger => !slugInMaintenance.includes(trigger.message.konnector)
)

if (hasReachMaxAccounts(activeTrigger.length)) {
return 'max_accounts'
}

if (slugInMaintenance.includes(slug)) {
return null
}

const currentKonnectorTriggers = triggers.filter(
trigger => trigger.message?.konnector === slug
)
Expand Down
107 changes: 106 additions & 1 deletion packages/cozy-harvest-lib/src/helpers/accounts.spec.js
Expand Up @@ -5,9 +5,14 @@ import {
updateTwoFaCode,
resetState,
getVaultCipherId,
setSessionResetIfNecessary
setSessionResetIfNecessary,
checkMaxAccounts
} from 'helpers/accounts'

import flag from 'cozy-flags'

jest.mock('cozy-flags')

const fixtures = {
konnector: {
slug: 'konnectest',
Expand Down Expand Up @@ -173,4 +178,104 @@ describe('Accounts Helper', () => {
).toEqual('cipher-id')
})
})

describe('checkMaxAccounts', () => {
const client = {
fetchQueryAndGetFromState: jest.fn()
}

beforeEach(() => {
flag.mockImplementation(flag => {
switch (flag) {
case 'harvest.accounts.maxByKonnector.konnector1':
return 1
case 'harvest.accounts.maxByKonnector.konnector2':
return 2
case 'harvest.accounts.max':
return 3
default:
return null
}
})
})

afterEach(() => {
jest.clearAllMocks()
})

it('should return "max_accounts" if there are too many active triggers', async () => {
const triggers = [
{ message: { konnector: 'konnector1' } },
{ message: { konnector: 'konnector2' } },
{ message: { konnector: 'konnector1' } },
{ message: { konnector: 'konnector2' } },
{ message: { konnector: 'konnector1' } }
]
const maintenance = [
{ slug: 'konnector1', maintenance_activated: false },
{ slug: 'konnector2', maintenance_activated: true }
]
client.fetchQueryAndGetFromState
.mockResolvedValueOnce({ data: triggers })
.mockResolvedValueOnce({ data: maintenance })

const result = await checkMaxAccounts('konnector1', client)

expect(result).toBe('max_accounts')
})

it('should return null if the konnector is in maintenance', async () => {
const triggers = [
{ message: { konnector: 'konnector1' } },
{ message: { konnector: 'konnector2' } }
]
const maintenance = [
{ slug: 'konnector1', maintenance_activated: true },
{ slug: 'konnector2', maintenance_activated: false }
]
client.fetchQueryAndGetFromState
.mockResolvedValueOnce({ data: triggers })
.mockResolvedValueOnce({ data: maintenance })

const result = await checkMaxAccounts('konnector1', client)

expect(result).toBeNull()
})

it('should return "max_accounts_by_konnector" if there are too many accounts for the konnector', async () => {
const triggers = [
{ message: { konnector: 'konnector1' } },
{ message: { konnector: 'konnector2' } }
]
const maintenance = [
{ slug: 'konnector1', maintenance_activated: false },
{ slug: 'konnector2', maintenance_activated: false }
]
client.fetchQueryAndGetFromState
.mockResolvedValueOnce({ data: triggers })
.mockResolvedValueOnce({ data: maintenance })

const result = await checkMaxAccounts('konnector1', client)

expect(result).toBe('max_accounts_by_konnector')
})

it('should return null if there are not too many accounts for the konnector', async () => {
const triggers = [
{ message: { konnector: 'konnector1' } },
{ message: { konnector: 'konnector2' } }
]
const maintenance = [
{ slug: 'konnector1', maintenance_activated: false },
{ slug: 'konnector2', maintenance_activated: false }
]
client.fetchQueryAndGetFromState
.mockResolvedValueOnce({ data: triggers })
.mockResolvedValueOnce({ data: maintenance })

const result = await checkMaxAccounts('konnector2', client)

expect(result).toBeNull()
})
})
})
8 changes: 8 additions & 0 deletions packages/cozy-harvest-lib/src/helpers/queries.js
Expand Up @@ -84,3 +84,11 @@ export const buildCountTriggersQuery = () => ({
fetchPolicy: defaultFetchPolicy
}
})

export const buildAppsRegistryMaintenance = () => ({
definition: Q('io.cozy.apps_registry').getById('maintenance'),
options: {
as: 'io.cozy.apps_registry/maintenance',
fetchPolicy: defaultFetchPolicy
}
})

0 comments on commit f0f0fcd

Please sign in to comment.