mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
fix: Timezone Problems on Change of Month
This commit is contained in:
parent
5032307e2b
commit
5e2d6c3bc9
@ -2,7 +2,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
|
||||||
import { objectValuesToArray } from '@/util/utilities'
|
import { objectValuesToArray } from '@/util/utilities'
|
||||||
import { testEnvironment, resetToken, cleanDB } from '@test/helpers'
|
import { testEnvironment, resetToken, cleanDB, contributionDateFormatter } from '@test/helpers'
|
||||||
import { userFactory } from '@/seeds/factory/user'
|
import { userFactory } from '@/seeds/factory/user'
|
||||||
import { creationFactory } from '@/seeds/factory/creation'
|
import { creationFactory } from '@/seeds/factory/creation'
|
||||||
import { creations } from '@/seeds/creation/index'
|
import { creations } from '@/seeds/creation/index'
|
||||||
@ -83,6 +83,12 @@ let user: User
|
|||||||
let creation: Contribution | void
|
let creation: Contribution | void
|
||||||
let result: any
|
let result: any
|
||||||
|
|
||||||
|
describe('contributionDateFormatter', () => {
|
||||||
|
it('formats the date correctly', () => {
|
||||||
|
expect(contributionDateFormatter(new Date('Thu Feb 29 2024 13:12:11'))).toEqual('2/29/2024')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('AdminResolver', () => {
|
describe('AdminResolver', () => {
|
||||||
describe('set user role', () => {
|
describe('set user role', () => {
|
||||||
describe('unauthenticated', () => {
|
describe('unauthenticated', () => {
|
||||||
@ -139,7 +145,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user to get a new role does not exist', () => {
|
describe('user to get a new role does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: setUserRole, variables: { userId: admin.id + 1, isAdmin: true } }),
|
mutate({ mutation: setUserRole, variables: { userId: admin.id + 1, isAdmin: true } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -196,7 +201,6 @@ describe('AdminResolver', () => {
|
|||||||
describe('change role with error', () => {
|
describe('change role with error', () => {
|
||||||
describe('is own role', () => {
|
describe('is own role', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: setUserRole, variables: { userId: admin.id, isAdmin: false } }),
|
mutate({ mutation: setUserRole, variables: { userId: admin.id, isAdmin: false } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -213,7 +217,6 @@ describe('AdminResolver', () => {
|
|||||||
describe('user has already role to be set', () => {
|
describe('user has already role to be set', () => {
|
||||||
describe('to admin', () => {
|
describe('to admin', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: setUserRole,
|
mutation: setUserRole,
|
||||||
variables: { userId: user.id, isAdmin: true },
|
variables: { userId: user.id, isAdmin: true },
|
||||||
@ -234,7 +237,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('to usual user', () => {
|
describe('to usual user', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: setUserRole,
|
mutation: setUserRole,
|
||||||
variables: { userId: user.id, isAdmin: false },
|
variables: { userId: user.id, isAdmin: false },
|
||||||
@ -311,7 +313,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user to be deleted does not exist', () => {
|
describe('user to be deleted does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: deleteUser, variables: { userId: admin.id + 1 } }),
|
mutate({ mutation: deleteUser, variables: { userId: admin.id + 1 } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -328,7 +329,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('delete self', () => {
|
describe('delete self', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: deleteUser, variables: { userId: admin.id } }),
|
mutate({ mutation: deleteUser, variables: { userId: admin.id } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -362,7 +362,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('delete deleted user', () => {
|
describe('delete deleted user', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: deleteUser, variables: { userId: user.id } }),
|
mutate({ mutation: deleteUser, variables: { userId: user.id } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -434,7 +433,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user to be undelete does not exist', () => {
|
describe('user to be undelete does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: unDeleteUser, variables: { userId: admin.id + 1 } }),
|
mutate({ mutation: unDeleteUser, variables: { userId: admin.id + 1 } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -455,7 +453,6 @@ describe('AdminResolver', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: unDeleteUser, variables: { userId: user.id } }),
|
mutate({ mutation: unDeleteUser, variables: { userId: user.id } }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -751,7 +748,7 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -861,7 +858,7 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -936,19 +933,24 @@ describe('AdminResolver', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('adminCreateContribution', () => {
|
describe('adminCreateContribution', () => {
|
||||||
|
const now = new Date()
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
const now = new Date()
|
|
||||||
creation = await creationFactory(testEnv, {
|
creation = await creationFactory(testEnv, {
|
||||||
email: 'peter@lustig.de',
|
email: 'peter@lustig.de',
|
||||||
amount: 400,
|
amount: 400,
|
||||||
memo: 'Herzlich Willkommen bei Gradido!',
|
memo: 'Herzlich Willkommen bei Gradido!',
|
||||||
creationDate: new Date(now.getFullYear(), now.getMonth() - 1, 1).toISOString(),
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, 1),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('user to create for does not exist', () => {
|
describe('user to create for does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
variables.creationDate = contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, 1),
|
||||||
|
)
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -969,10 +971,12 @@ describe('AdminResolver', () => {
|
|||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
user = await userFactory(testEnv, stephenHawking)
|
user = await userFactory(testEnv, stephenHawking)
|
||||||
variables.email = 'stephen@hawking.uk'
|
variables.email = 'stephen@hawking.uk'
|
||||||
|
variables.creationDate = contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, 1),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -995,10 +999,12 @@ describe('AdminResolver', () => {
|
|||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
user = await userFactory(testEnv, garrickOllivander)
|
user = await userFactory(testEnv, garrickOllivander)
|
||||||
variables.email = 'garrick@ollivander.com'
|
variables.email = 'garrick@ollivander.com'
|
||||||
|
variables.creationDate = contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, 1),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1021,39 +1027,31 @@ describe('AdminResolver', () => {
|
|||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
user = await userFactory(testEnv, bibiBloxberg)
|
user = await userFactory(testEnv, bibiBloxberg)
|
||||||
variables.email = 'bibi@bloxberg.de'
|
variables.email = 'bibi@bloxberg.de'
|
||||||
|
variables.creationDate = 'invalid-date'
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('date of creation is not a date string', () => {
|
describe('date of creation is not a date string', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
errors: [
|
errors: [new GraphQLError(`invalid Date for creationDate=invalid-date`)],
|
||||||
new GraphQLError('No information for available creations for the given date'),
|
|
||||||
],
|
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('logs the error thrown', () => {
|
it('logs the error thrown', () => {
|
||||||
expect(logger.error).toBeCalledWith(
|
expect(logger.error).toBeCalledWith(`invalid Date for creationDate=invalid-date`)
|
||||||
'No information for available creations with the given creationDate=',
|
|
||||||
'Invalid Date',
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('date of creation is four months ago', () => {
|
describe('date of creation is four months ago', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
const now = new Date()
|
variables.creationDate = contributionDateFormatter(
|
||||||
variables.creationDate = new Date(
|
new Date(now.getFullYear(), now.getMonth() - 4, 1),
|
||||||
now.getFullYear(),
|
)
|
||||||
now.getMonth() - 4,
|
|
||||||
1,
|
|
||||||
).toString()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1068,7 +1066,7 @@ describe('AdminResolver', () => {
|
|||||||
it('logs the error thrown', () => {
|
it('logs the error thrown', () => {
|
||||||
expect(logger.error).toBeCalledWith(
|
expect(logger.error).toBeCalledWith(
|
||||||
'No information for available creations with the given creationDate=',
|
'No information for available creations with the given creationDate=',
|
||||||
variables.creationDate,
|
new Date(variables.creationDate).toISOString(),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -1076,12 +1074,9 @@ describe('AdminResolver', () => {
|
|||||||
describe('date of creation is in the future', () => {
|
describe('date of creation is in the future', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
jest.clearAllMocks()
|
||||||
const now = new Date()
|
variables.creationDate = contributionDateFormatter(
|
||||||
variables.creationDate = new Date(
|
new Date(now.getFullYear(), now.getMonth() + 4, 1),
|
||||||
now.getFullYear(),
|
)
|
||||||
now.getMonth() + 4,
|
|
||||||
1,
|
|
||||||
).toString()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1096,15 +1091,14 @@ describe('AdminResolver', () => {
|
|||||||
it('logs the error thrown', () => {
|
it('logs the error thrown', () => {
|
||||||
expect(logger.error).toBeCalledWith(
|
expect(logger.error).toBeCalledWith(
|
||||||
'No information for available creations with the given creationDate=',
|
'No information for available creations with the given creationDate=',
|
||||||
variables.creationDate,
|
new Date(variables.creationDate).toISOString(),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('amount of creation is too high', () => {
|
describe('amount of creation is too high', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
variables.creationDate = contributionDateFormatter(now)
|
||||||
variables.creationDate = new Date().toString()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({ mutation: adminCreateContribution, variables }),
|
mutate({ mutation: adminCreateContribution, variables }),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1192,7 +1186,7 @@ describe('AdminResolver', () => {
|
|||||||
email,
|
email,
|
||||||
amount: new Decimal(500),
|
amount: new Decimal(500),
|
||||||
memo: 'Grundeinkommen',
|
memo: 'Grundeinkommen',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1229,7 +1223,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user for creation to update does not exist', () => {
|
describe('user for creation to update does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminUpdateContribution,
|
mutation: adminUpdateContribution,
|
||||||
@ -1238,7 +1231,7 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bob@baumeister.de',
|
email: 'bob@baumeister.de',
|
||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1259,7 +1252,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user for creation to update is deleted', () => {
|
describe('user for creation to update is deleted', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminUpdateContribution,
|
mutation: adminUpdateContribution,
|
||||||
@ -1268,7 +1260,7 @@ describe('AdminResolver', () => {
|
|||||||
email: 'stephen@hawking.uk',
|
email: 'stephen@hawking.uk',
|
||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1285,7 +1277,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('creation does not exist', () => {
|
describe('creation does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminUpdateContribution,
|
mutation: adminUpdateContribution,
|
||||||
@ -1294,7 +1285,7 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1311,7 +1302,6 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
describe('user email does not match creation user', () => {
|
describe('user email does not match creation user', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminUpdateContribution,
|
mutation: adminUpdateContribution,
|
||||||
@ -1321,8 +1311,8 @@ describe('AdminResolver', () => {
|
|||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Bibi!',
|
memo: 'Danke Bibi!',
|
||||||
creationDate: creation
|
creationDate: creation
|
||||||
? creation.contributionDate.toString()
|
? contributionDateFormatter(creation.contributionDate)
|
||||||
: new Date().toString(),
|
: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1346,7 +1336,6 @@ describe('AdminResolver', () => {
|
|||||||
describe('creation update is not valid', () => {
|
describe('creation update is not valid', () => {
|
||||||
// as this test has not clearly defined that date, it is a false positive
|
// as this test has not clearly defined that date, it is a false positive
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminUpdateContribution,
|
mutation: adminUpdateContribution,
|
||||||
@ -1356,15 +1345,15 @@ describe('AdminResolver', () => {
|
|||||||
amount: new Decimal(1900),
|
amount: new Decimal(1900),
|
||||||
memo: 'Danke Peter!',
|
memo: 'Danke Peter!',
|
||||||
creationDate: creation
|
creationDate: creation
|
||||||
? creation.contributionDate.toString()
|
? contributionDateFormatter(creation.contributionDate)
|
||||||
: new Date().toString(),
|
: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
errors: [
|
errors: [
|
||||||
new GraphQLError(
|
new GraphQLError(
|
||||||
'The amount (1900 GDD) to be created exceeds the amount (1000 GDD) still available for this month.',
|
'The amount (1900 GDD) to be created exceeds the amount (600 GDD) still available for this month.',
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
@ -1373,7 +1362,7 @@ describe('AdminResolver', () => {
|
|||||||
|
|
||||||
it('logs the error thrown', () => {
|
it('logs the error thrown', () => {
|
||||||
expect(logger.error).toBeCalledWith(
|
expect(logger.error).toBeCalledWith(
|
||||||
'The amount (1900 GDD) to be created exceeds the amount (1000 GDD) still available for this month.',
|
'The amount (1900 GDD) to be created exceeds the amount (600 GDD) still available for this month.',
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -1390,8 +1379,8 @@ describe('AdminResolver', () => {
|
|||||||
amount: new Decimal(300),
|
amount: new Decimal(300),
|
||||||
memo: 'Danke Peter!',
|
memo: 'Danke Peter!',
|
||||||
creationDate: creation
|
creationDate: creation
|
||||||
? creation.contributionDate.toString()
|
? contributionDateFormatter(creation.contributionDate)
|
||||||
: new Date().toString(),
|
: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1430,8 +1419,8 @@ describe('AdminResolver', () => {
|
|||||||
amount: new Decimal(200),
|
amount: new Decimal(200),
|
||||||
memo: 'Das war leider zu Viel!',
|
memo: 'Das war leider zu Viel!',
|
||||||
creationDate: creation
|
creationDate: creation
|
||||||
? creation.contributionDate.toString()
|
? contributionDateFormatter(creation.contributionDate)
|
||||||
: new Date().toString(),
|
: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).resolves.toEqual(
|
).resolves.toEqual(
|
||||||
@ -1523,7 +1512,6 @@ describe('AdminResolver', () => {
|
|||||||
describe('adminDeleteContribution', () => {
|
describe('adminDeleteContribution', () => {
|
||||||
describe('creation id does not exist', () => {
|
describe('creation id does not exist', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminDeleteContribution,
|
mutation: adminDeleteContribution,
|
||||||
@ -1554,13 +1542,12 @@ describe('AdminResolver', () => {
|
|||||||
variables: {
|
variables: {
|
||||||
amount: 100.0,
|
amount: 100.0,
|
||||||
memo: 'Test env contribution',
|
memo: 'Test env contribution',
|
||||||
creationDate: new Date().toString(),
|
creationDate: contributionDateFormatter(new Date()),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: adminDeleteContribution,
|
mutation: adminDeleteContribution,
|
||||||
@ -1606,7 +1593,6 @@ describe('AdminResolver', () => {
|
|||||||
describe('confirmContribution', () => {
|
describe('confirmContribution', () => {
|
||||||
describe('creation does not exits', () => {
|
describe('creation does not exits', () => {
|
||||||
it('throws an error', async () => {
|
it('throws an error', async () => {
|
||||||
jest.clearAllMocks()
|
|
||||||
await expect(
|
await expect(
|
||||||
mutate({
|
mutate({
|
||||||
mutation: confirmContribution,
|
mutation: confirmContribution,
|
||||||
@ -1633,7 +1619,9 @@ describe('AdminResolver', () => {
|
|||||||
email: 'peter@lustig.de',
|
email: 'peter@lustig.de',
|
||||||
amount: 400,
|
amount: 400,
|
||||||
memo: 'Herzlich Willkommen bei Gradido!',
|
memo: 'Herzlich Willkommen bei Gradido!',
|
||||||
creationDate: new Date(now.getFullYear(), now.getMonth() - 1, 1).toISOString(),
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, 1),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1664,7 +1652,9 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: 450,
|
amount: 450,
|
||||||
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
||||||
creationDate: new Date(now.getFullYear(), now.getMonth() - 2, 1).toISOString(),
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 2, 1),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1735,13 +1725,17 @@ describe('AdminResolver', () => {
|
|||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: 50,
|
amount: 50,
|
||||||
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
||||||
creationDate: new Date(now.getFullYear(), now.getMonth() - 2, 1).toISOString(),
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 2, 1),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
c2 = await creationFactory(testEnv, {
|
c2 = await creationFactory(testEnv, {
|
||||||
email: 'bibi@bloxberg.de',
|
email: 'bibi@bloxberg.de',
|
||||||
amount: 50,
|
amount: 50,
|
||||||
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
memo: 'Herzlich Willkommen bei Gradido liebe Bibi!',
|
||||||
creationDate: new Date(now.getFullYear(), now.getMonth() - 2, 1).toISOString(),
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 2, 1),
|
||||||
|
),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
237
backend/src/graphql/resolver/util/creations.test.ts
Normal file
237
backend/src/graphql/resolver/util/creations.test.ts
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
|
||||||
|
import {
|
||||||
|
testEnvironment,
|
||||||
|
resetToken,
|
||||||
|
cleanDB,
|
||||||
|
contributionDateFormatter,
|
||||||
|
setClientRequestTime,
|
||||||
|
toJSTzone,
|
||||||
|
toPSTzone,
|
||||||
|
} from '@test/helpers'
|
||||||
|
import { logger } from '@test/testSetup'
|
||||||
|
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
|
||||||
|
import { peterLustig } from '@/seeds/users/peter-lustig'
|
||||||
|
import { User } from '@entity/User'
|
||||||
|
import { Contribution } from '@entity/Contribution'
|
||||||
|
import { userFactory } from '@/seeds/factory/user'
|
||||||
|
import { login, createContribution, adminCreateContribution } from '@/seeds/graphql/mutations'
|
||||||
|
import { getUserCreation } from './creations'
|
||||||
|
|
||||||
|
let mutate: any, query: any, con: any
|
||||||
|
let testEnv: any
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
testEnv = await testEnvironment()
|
||||||
|
mutate = testEnv.mutate
|
||||||
|
query = testEnv.query
|
||||||
|
con = testEnv.con
|
||||||
|
await cleanDB()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
// await cleanDB()
|
||||||
|
await con.close()
|
||||||
|
})
|
||||||
|
|
||||||
|
const setZeroHours = (date: Date): Date => {
|
||||||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate())
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('util/creation', () => {
|
||||||
|
let user: User
|
||||||
|
let admin: User
|
||||||
|
|
||||||
|
const now = new Date()
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
user = await userFactory(testEnv, bibiBloxberg)
|
||||||
|
admin = await userFactory(testEnv, peterLustig)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('getUserCreations', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
setClientRequestTime(now.toString())
|
||||||
|
await mutate({
|
||||||
|
mutation: login,
|
||||||
|
variables: { email: 'peter@lustig.de', password: 'Aa12345_' },
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: adminCreateContribution,
|
||||||
|
variables: {
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 250.0,
|
||||||
|
memo: 'Admin contribution for this month',
|
||||||
|
creationDate: contributionDateFormatter(now),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: adminCreateContribution,
|
||||||
|
variables: {
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 160.0,
|
||||||
|
memo: 'Admin contribution for the last month',
|
||||||
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: adminCreateContribution,
|
||||||
|
variables: {
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 450.0,
|
||||||
|
memo: 'Admin contribution for two months ago',
|
||||||
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 2, now.getDate()),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: login,
|
||||||
|
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: createContribution,
|
||||||
|
variables: {
|
||||||
|
amount: 400.0,
|
||||||
|
memo: 'Contribution for this month',
|
||||||
|
creationDate: contributionDateFormatter(now),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
await mutate({
|
||||||
|
mutation: createContribution,
|
||||||
|
variables: {
|
||||||
|
amount: 500.0,
|
||||||
|
memo: 'Contribution for the last month',
|
||||||
|
creationDate: contributionDateFormatter(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('has the correct data setup', async () => {
|
||||||
|
await expect(Contribution.find()).resolves.toEqual([
|
||||||
|
expect.objectContaining({
|
||||||
|
userId: user.id,
|
||||||
|
contributionDate: setZeroHours(now),
|
||||||
|
clientRequestTime: now.toString(),
|
||||||
|
amount: expect.decimalEqual(250),
|
||||||
|
memo: 'Admin contribution for this month',
|
||||||
|
moderatorId: admin.id,
|
||||||
|
contributionType: 'ADMIN',
|
||||||
|
contributionStatus: 'PENDING',
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
userId: user.id,
|
||||||
|
contributionDate: setZeroHours(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()),
|
||||||
|
),
|
||||||
|
clientRequestTime: now.toString(),
|
||||||
|
amount: expect.decimalEqual(160),
|
||||||
|
memo: 'Admin contribution for the last month',
|
||||||
|
moderatorId: admin.id,
|
||||||
|
contributionType: 'ADMIN',
|
||||||
|
contributionStatus: 'PENDING',
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
userId: user.id,
|
||||||
|
contributionDate: setZeroHours(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 2, now.getDate()),
|
||||||
|
),
|
||||||
|
clientRequestTime: now.toString(),
|
||||||
|
amount: expect.decimalEqual(450),
|
||||||
|
memo: 'Admin contribution for two months ago',
|
||||||
|
moderatorId: admin.id,
|
||||||
|
contributionType: 'ADMIN',
|
||||||
|
contributionStatus: 'PENDING',
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
userId: user.id,
|
||||||
|
contributionDate: setZeroHours(now),
|
||||||
|
clientRequestTime: now.toString(),
|
||||||
|
amount: expect.decimalEqual(400),
|
||||||
|
memo: 'Contribution for this month',
|
||||||
|
moderatorId: null,
|
||||||
|
contributionType: 'USER',
|
||||||
|
contributionStatus: 'PENDING',
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
userId: user.id,
|
||||||
|
contributionDate: setZeroHours(
|
||||||
|
new Date(now.getFullYear(), now.getMonth() - 1, now.getDate()),
|
||||||
|
),
|
||||||
|
clientRequestTime: now.toString(),
|
||||||
|
amount: expect.decimalEqual(500),
|
||||||
|
memo: 'Contribution for the last month',
|
||||||
|
moderatorId: null,
|
||||||
|
contributionType: 'USER',
|
||||||
|
contributionStatus: 'PENDING',
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('call getUserCreation now', () => {
|
||||||
|
it('returns the expected open contributions', async () => {
|
||||||
|
await expect(getUserCreation(user.id, now.toString())).resolves.toEqual([
|
||||||
|
expect.decimalEqual(550),
|
||||||
|
expect.decimalEqual(340),
|
||||||
|
expect.decimalEqual(350),
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('run forward in time one hour before next month', () => {
|
||||||
|
const targetDate = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 0, 0)
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
jest.useFakeTimers()
|
||||||
|
/* eslint-disable-next-line @typescript-eslint/no-empty-function */
|
||||||
|
setTimeout(() => {}, targetDate.getTime() - now.getTime())
|
||||||
|
jest.runAllTimers()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('has the clock set correctly', () => {
|
||||||
|
expect(new Date().toISOString()).toContain(
|
||||||
|
`${targetDate.getFullYear()}-${targetDate.getMonth() + 1}-${targetDate.getDate()}T23:`,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('call getUserCreation with UTC', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
setClientRequestTime(targetDate.toString())
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the expected open contributions', async () => {
|
||||||
|
await expect(getUserCreation(user.id, now.toString())).resolves.toEqual([
|
||||||
|
expect.decimalEqual(550),
|
||||||
|
expect.decimalEqual(340),
|
||||||
|
expect.decimalEqual(350),
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('call getUserCreation with JST (GMT+0900)', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
setClientRequestTime(toJSTzone(targetDate.toString()))
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the expected open contributions', async () => {
|
||||||
|
await expect(
|
||||||
|
getUserCreation(user.id, toJSTzone(targetDate.toString())),
|
||||||
|
).resolves.toEqual([
|
||||||
|
expect.decimalEqual(340),
|
||||||
|
expect.decimalEqual(350),
|
||||||
|
expect.decimalEqual(1000),
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
jest.useRealTimers()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
@ -16,6 +16,7 @@ const context = {
|
|||||||
push: headerPushMock,
|
push: headerPushMock,
|
||||||
forEach: jest.fn(),
|
forEach: jest.fn(),
|
||||||
},
|
},
|
||||||
|
clientRequestTime: '',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const cleanDB = async () => {
|
export const cleanDB = async () => {
|
||||||
@ -46,3 +47,8 @@ export const resetEntity = async (entity: any) => {
|
|||||||
export const resetToken = () => {
|
export const resetToken = () => {
|
||||||
context.token = ''
|
context.token = ''
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// format date string as it comes from the frontend for the contribution date
|
||||||
|
export const contributionDateFormatter = (date: Date): string => {
|
||||||
|
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user