Merge branch 'master' into ui_updates_linked_transaction

This commit is contained in:
einhornimmond 2025-11-19 19:56:57 +01:00 committed by GitHub
commit a8c49e3142
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 36 additions and 31 deletions

View File

@ -947,7 +947,7 @@ describe('TransactionLinkResolver', () => {
}) })
describe('without any filters', () => { describe('without any filters', () => {
it('finds 6 open transaction links and no deleted or redeemed', async () => { it('finds 7 open transaction links and no deleted or redeemed', async () => {
await expect( await expect(
query({ query({
query: listTransactionLinksAdmin, query: listTransactionLinksAdmin,
@ -957,14 +957,14 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({ expect.objectContaining({
data: { data: {
listTransactionLinksAdmin: { listTransactionLinksAdmin: {
count: 6, count: 7,
links: expect.not.arrayContaining([ links: expect.not.arrayContaining([
expect.objectContaining({ expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: expect.any(String), createdAt: expect.any(String),
}), }),
expect.objectContaining({ expect.objectContaining({
memo: 'Da habe ich mich wohl etwas übernommen.', memo: "Kein Trick, keine Zauberrei,\n bei Gradidio sei dabei!",
deletedAt: expect.any(String), deletedAt: expect.any(String),
}), }),
]), ]),
@ -976,7 +976,7 @@ describe('TransactionLinkResolver', () => {
}) })
describe('all filters are null', () => { describe('all filters are null', () => {
it('finds 6 open transaction links and no deleted or redeemed', async () => { it('finds 7 open transaction links and no deleted or redeemed', async () => {
await expect( await expect(
query({ query({
query: listTransactionLinksAdmin, query: listTransactionLinksAdmin,
@ -993,10 +993,10 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({ expect.objectContaining({
data: { data: {
listTransactionLinksAdmin: { listTransactionLinksAdmin: {
count: 6, count: 7,
links: expect.not.arrayContaining([ links: expect.not.arrayContaining([
expect.objectContaining({ expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: expect.any(String), createdAt: expect.any(String),
}), }),
expect.objectContaining({ expect.objectContaining({
@ -1012,7 +1012,7 @@ describe('TransactionLinkResolver', () => {
}) })
describe('filter with deleted', () => { describe('filter with deleted', () => {
it('finds 6 open transaction links, 1 deleted, and no redeemed', async () => { it('finds 7 open transaction links, 1 deleted, and no redeemed', async () => {
await expect( await expect(
query({ query({
query: listTransactionLinksAdmin, query: listTransactionLinksAdmin,
@ -1027,10 +1027,10 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({ expect.objectContaining({
data: { data: {
listTransactionLinksAdmin: { listTransactionLinksAdmin: {
count: 7, count: 8,
links: expect.arrayContaining([ links: expect.arrayContaining([
expect.not.objectContaining({ expect.not.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: expect.any(String), createdAt: expect.any(String),
}), }),
expect.objectContaining({ expect.objectContaining({
@ -1046,7 +1046,7 @@ describe('TransactionLinkResolver', () => {
}) })
describe('filter by expired', () => { describe('filter by expired', () => {
it('finds 5 open transaction links, 1 expired, and no redeemed', async () => { it('finds 6 open transaction links, 1 expired, and no redeemed', async () => {
await expect( await expect(
query({ query({
query: listTransactionLinksAdmin, query: listTransactionLinksAdmin,
@ -1064,7 +1064,7 @@ describe('TransactionLinkResolver', () => {
count: 7, count: 7,
links: expect.arrayContaining([ links: expect.arrayContaining([
expect.objectContaining({ expect.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: expect.any(String), createdAt: expect.any(String),
}), }),
expect.not.objectContaining({ expect.not.objectContaining({
@ -1082,7 +1082,7 @@ describe('TransactionLinkResolver', () => {
// TODO: works not as expected, because 'redeemedAt' and 'redeemedBy' have to be added to the transaktion link factory // TODO: works not as expected, because 'redeemedAt' and 'redeemedBy' have to be added to the transaktion link factory
describe.skip('filter by redeemed', () => { describe.skip('filter by redeemed', () => {
it('finds 6 open transaction links, 1 deleted, and no redeemed', async () => { it('finds 7 open transaction links, 1 deleted, and no redeemed', async () => {
await expect( await expect(
query({ query({
query: listTransactionLinksAdmin, query: listTransactionLinksAdmin,
@ -1099,10 +1099,10 @@ describe('TransactionLinkResolver', () => {
expect.objectContaining({ expect.objectContaining({
data: { data: {
listTransactionLinksAdmin: { listTransactionLinksAdmin: {
count: 6, count: 7,
links: expect.arrayContaining([ links: expect.arrayContaining([
expect.not.objectContaining({ expect.not.objectContaining({
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: expect.any(String), createdAt: expect.any(String),
}), }),
expect.objectContaining({ expect.objectContaining({

View File

@ -1040,7 +1040,7 @@ describe('UserResolver', () => {
describe('user exists in DB', () => { describe('user exists in DB', () => {
beforeAll(async () => { beforeAll(async () => {
await userFactory(testEnv, bibiBloxberg) await userFactory(testEnv, bobBaumeister)
}) })
afterAll(async () => { afterAll(async () => {
@ -1050,7 +1050,7 @@ describe('UserResolver', () => {
describe('duration not expired', () => { describe('duration not expired', () => {
it('throws an error', async () => { it('throws an error', async () => {
await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( await expect(mutate({ mutation: forgotPassword, variables: { email: 'bob@baumeister.de' } })).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
errors: [ errors: [
new GraphQLError( new GraphQLError(
@ -1067,7 +1067,7 @@ describe('UserResolver', () => {
describe('duration reset to 0', () => { describe('duration reset to 0', () => {
it('returns true', async () => { it('returns true', async () => {
CONFIG.EMAIL_CODE_REQUEST_TIME = 0 CONFIG.EMAIL_CODE_REQUEST_TIME = 0
await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( await expect(mutate({ mutation: forgotPassword, variables: { email: 'bob@baumeister.de' } })).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
data: { data: {
forgotPassword: true, forgotPassword: true,
@ -1078,9 +1078,9 @@ describe('UserResolver', () => {
it('sends reset password email', () => { it('sends reset password email', () => {
expect(sendResetPasswordEmail).toBeCalledWith({ expect(sendResetPasswordEmail).toBeCalledWith({
firstName: 'Bibi', firstName: 'Bob',
lastName: 'Bloxberg', lastName: 'der Baumeister',
email: 'bibi@bloxberg.de', email: 'bob@baumeister.de',
language: 'de', language: 'de',
resetLink: expect.any(String), resetLink: expect.any(String),
timeDurationObject: expect.objectContaining({ timeDurationObject: expect.objectContaining({
@ -1092,7 +1092,7 @@ describe('UserResolver', () => {
it('stores the EMAIL_FORGOT_PASSWORD event in the database', async () => { it('stores the EMAIL_FORGOT_PASSWORD event in the database', async () => {
const userConatct = await UserContact.findOneOrFail({ const userConatct = await UserContact.findOneOrFail({
where: { email: 'bibi@bloxberg.de' }, where: { email: 'bob@baumeister.de' },
relations: ['user'], relations: ['user'],
}) })
await expect(DbEvent.find()).resolves.toContainEqual( await expect(DbEvent.find()).resolves.toContainEqual(
@ -1108,7 +1108,7 @@ describe('UserResolver', () => {
describe('request reset password again', () => { describe('request reset password again', () => {
it('throws an error', async () => { it('throws an error', async () => {
CONFIG.EMAIL_CODE_REQUEST_TIME = emailCodeRequestTime CONFIG.EMAIL_CODE_REQUEST_TIME = emailCodeRequestTime
await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( await expect(mutate({ mutation: forgotPassword, variables: { email: 'bob@baumeister.de' } })).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
errors: [new GraphQLError('Email already sent less than 10 minutes ago')], errors: [new GraphQLError('Email already sent less than 10 minutes ago')],
}), }),
@ -1128,8 +1128,8 @@ describe('UserResolver', () => {
let emailContact: UserContact let emailContact: UserContact
beforeAll(async () => { beforeAll(async () => {
await userFactory(testEnv, bibiBloxberg) await userFactory(testEnv, bobBaumeister)
emailContact = await UserContact.findOneOrFail({ where: { email: bibiBloxberg.email } }) emailContact = await UserContact.findOneOrFail({ where: { email: bobBaumeister.email } })
}) })
afterAll(async () => { afterAll(async () => {
@ -1140,7 +1140,7 @@ describe('UserResolver', () => {
it('throws an error', async () => { it('throws an error', async () => {
jest.clearAllMocks() jest.clearAllMocks()
await expect( await expect(
query({ query: queryOptIn, variables: { optIn: 'not-valid' } }), query({ query: queryOptIn, variables: { email: 'bob@baumeister.de', optIn: 'not-valid' } }),
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({
errors: [ errors: [
@ -1161,7 +1161,7 @@ describe('UserResolver', () => {
await expect( await expect(
query({ query({
query: queryOptIn, query: queryOptIn,
variables: { optIn: emailContact.emailVerificationCode.toString() }, variables: { email: 'bob@baumeister.de', optIn: emailContact.emailVerificationCode.toString() },
}), }),
).resolves.toEqual( ).resolves.toEqual(
expect.objectContaining({ expect.objectContaining({

View File

@ -39,7 +39,7 @@ export const transactionLinkFactory = async (
} }
if (transactionLink.deletedAt) { if (transactionLink.deletedAt) {
dbTransactionLink.deletedAt = new Date() dbTransactionLink.deletedAt = new Date(dbTransactionLink.createdAt.getTime() + 1000)
await dbTransactionLink.save() await dbTransactionLink.save()
} }
} }

View File

@ -40,11 +40,15 @@ export const userFactory = async (
} }
// get last changes of user from database // get last changes of user from database
dbUser = await User.findOneOrFail({ where: { id }, relations: ['userRoles'] }) dbUser = await User.findOneOrFail({ where: { id }, relations: { userRoles: true, emailContact: true } })
if (user.createdAt || user.deletedAt || user.role) { if (user.createdAt || user.deletedAt || user.role) {
if (user.createdAt) { if (user.createdAt) {
dbUser.createdAt = user.createdAt dbUser.createdAt = user.createdAt
// make sure emailContact is also updated for e2e test, prevent failing when time between seeding and test run is < 1 minute
dbUser.emailContact.createdAt = user.createdAt
dbUser.emailContact.updatedAt = user.createdAt
await dbUser.emailContact.save()
} }
if (user.deletedAt) { if (user.deletedAt) {
dbUser.deletedAt = user.deletedAt dbUser.deletedAt = user.deletedAt

View File

@ -4,8 +4,7 @@ export const transactionLinks: TransactionLinkInterface[] = [
{ {
email: 'bibi@bloxberg.de', email: 'bibi@bloxberg.de',
amount: 19.99, amount: 19.99,
memo: 'Leider wollte niemand meine Gradidos zum Neujahr haben :(', memo: 'Leider wollte niemand meine Gradidos haben :(',
createdAt: new Date(2022, 0, 1),
}, },
{ {
email: 'bibi@bloxberg.de', email: 'bibi@bloxberg.de',

View File

@ -9,4 +9,6 @@ export const bibiBloxberg: UserInterface = {
emailChecked: true, emailChecked: true,
language: 'de', language: 'de',
publisherId: 1234, publisherId: 1234,
// move user createdAt before transaction link
createdAt: new Date(2021, 9, 17),
} }