mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
179 lines
5.6 KiB
TypeScript
179 lines
5.6 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
|
|
import { transactionLinkCode } from './TransactionLinkResolver'
|
|
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
|
|
import { peterLustig } from '@/seeds/users/peter-lustig'
|
|
import { cleanDB, testEnvironment } from '@test/helpers'
|
|
import { userFactory } from '@/seeds/factory/user'
|
|
import { login, createContributionLink, redeemTransactionLink } from '@/seeds/graphql/mutations'
|
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
|
import Decimal from 'decimal.js-light'
|
|
import { GraphQLError } from 'graphql'
|
|
|
|
let mutate: any, con: any
|
|
let testEnv: any
|
|
|
|
beforeAll(async () => {
|
|
testEnv = await testEnvironment()
|
|
mutate = testEnv.mutate
|
|
con = testEnv.con
|
|
await cleanDB()
|
|
await userFactory(testEnv, bibiBloxberg)
|
|
await userFactory(testEnv, peterLustig)
|
|
})
|
|
|
|
afterAll(async () => {
|
|
await cleanDB()
|
|
await con.close()
|
|
})
|
|
|
|
describe('TransactionLinkResolver', () => {
|
|
describe('redeem daily Contribution Link', () => {
|
|
const now = new Date()
|
|
let contributionLink: DbContributionLink | undefined
|
|
|
|
beforeAll(async () => {
|
|
await mutate({
|
|
mutation: login,
|
|
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
|
|
})
|
|
await mutate({
|
|
mutation: createContributionLink,
|
|
variables: {
|
|
amount: new Decimal(5),
|
|
name: 'Daily Contribution Link',
|
|
memo: 'Thank you for contribute daily to the community',
|
|
cycle: 'DAILY',
|
|
validFrom: new Date(now.getFullYear(), 0, 1).toISOString(),
|
|
validTo: new Date(now.getFullYear(), 11, 31, 23, 59, 59, 999).toISOString(),
|
|
maxAmountPerMonth: new Decimal(200),
|
|
maxPerCycle: 1,
|
|
},
|
|
})
|
|
})
|
|
|
|
it('has a daily contribution link in the database', async () => {
|
|
const cls = await DbContributionLink.find()
|
|
expect(cls).toHaveLength(1)
|
|
contributionLink = cls[0]
|
|
expect(contributionLink).toEqual(
|
|
expect.objectContaining({
|
|
id: expect.any(Number),
|
|
name: 'Daily Contribution Link',
|
|
memo: 'Thank you for contribute daily to the community',
|
|
validFrom: new Date(now.getFullYear(), 0, 1),
|
|
validTo: new Date(now.getFullYear(), 11, 31, 23, 59, 59, 0),
|
|
cycle: 'DAILY',
|
|
maxPerCycle: 1,
|
|
totalMaxCountOfContribution: null,
|
|
maxAccountBalance: null,
|
|
minGapHours: null,
|
|
createdAt: expect.any(Date),
|
|
deletedAt: null,
|
|
code: expect.stringMatching(/^[0-9a-f]{24,24}$/),
|
|
linkEnabled: true,
|
|
amount: expect.decimalEqual(5),
|
|
maxAmountPerMonth: expect.decimalEqual(200),
|
|
}),
|
|
)
|
|
})
|
|
|
|
it('allows the user to redeem the contribution link', async () => {
|
|
await expect(
|
|
mutate({
|
|
mutation: redeemTransactionLink,
|
|
variables: {
|
|
code: 'CL-' + (contributionLink ? contributionLink.code : ''),
|
|
},
|
|
}),
|
|
).resolves.toMatchObject({
|
|
data: {
|
|
redeemTransactionLink: true,
|
|
},
|
|
errors: undefined,
|
|
})
|
|
})
|
|
|
|
it('does not allow the user to redeem the contribution link a second time on the same day', async () => {
|
|
await expect(
|
|
mutate({
|
|
mutation: redeemTransactionLink,
|
|
variables: {
|
|
code: 'CL-' + (contributionLink ? contributionLink.code : ''),
|
|
},
|
|
}),
|
|
).resolves.toMatchObject({
|
|
errors: [
|
|
new GraphQLError(
|
|
'Creation from contribution link was not successful. Error: Contribution link already redeemed today',
|
|
),
|
|
],
|
|
})
|
|
})
|
|
|
|
describe('after one day', () => {
|
|
beforeAll(async () => {
|
|
jest.useFakeTimers()
|
|
/* eslint-disable-next-line @typescript-eslint/no-empty-function */
|
|
setTimeout(() => {}, 1000 * 60 * 60 * 24)
|
|
jest.runAllTimers()
|
|
await mutate({
|
|
mutation: login,
|
|
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
|
|
})
|
|
})
|
|
|
|
afterAll(() => {
|
|
jest.useRealTimers()
|
|
})
|
|
|
|
it('allows the user to redeem the contribution link again', async () => {
|
|
await expect(
|
|
mutate({
|
|
mutation: redeemTransactionLink,
|
|
variables: {
|
|
code: 'CL-' + (contributionLink ? contributionLink.code : ''),
|
|
},
|
|
}),
|
|
).resolves.toMatchObject({
|
|
data: {
|
|
redeemTransactionLink: true,
|
|
},
|
|
errors: undefined,
|
|
})
|
|
})
|
|
|
|
it('does not allow the user to redeem the contribution link a second time on the same day', async () => {
|
|
await expect(
|
|
mutate({
|
|
mutation: redeemTransactionLink,
|
|
variables: {
|
|
code: 'CL-' + (contributionLink ? contributionLink.code : ''),
|
|
},
|
|
}),
|
|
).resolves.toMatchObject({
|
|
errors: [
|
|
new GraphQLError(
|
|
'Creation from contribution link was not successful. Error: Contribution link already redeemed today',
|
|
),
|
|
],
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('transactionLinkCode', () => {
|
|
const date = new Date()
|
|
|
|
it('returns a string of length 24', () => {
|
|
expect(transactionLinkCode(date)).toHaveLength(24)
|
|
})
|
|
|
|
it('returns a string that ends with the hex value of date', () => {
|
|
const regexp = new RegExp(date.getTime().toString(16) + '$')
|
|
expect(transactionLinkCode(date)).toEqual(expect.stringMatching(regexp))
|
|
})
|
|
})
|