Merge pull request #1621 from gradido/seed-transactions-in-backend

feat: Seed Creation Transactions in Backend
This commit is contained in:
Moriz Wahl 2022-03-16 22:09:20 +01:00 committed by GitHub
commit 89c6501318
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 127 additions and 16 deletions

View File

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers' import { testEnvironment, headerPushMock, resetToken, cleanDB } from '@test/helpers'
import { createUserFactory } from '@/seeds/factory/user' import { userFactory } from '@/seeds/factory/user'
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
import { createUser, setPassword } from '@/seeds/graphql/mutations' import { createUser, setPassword } from '@/seeds/graphql/mutations'
import { login, logout } from '@/seeds/graphql/queries' import { login, logout } from '@/seeds/graphql/queries'
@ -11,6 +11,7 @@ import { LoginEmailOptIn } from '@entity/LoginEmailOptIn'
import { User } from '@entity/User' import { User } from '@entity/User'
import CONFIG from '@/config' import CONFIG from '@/config'
import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail'
// import { klicktippSignIn } from '@/apis/KlicktippController' // import { klicktippSignIn } from '@/apis/KlicktippController'
jest.mock('@/mailer/sendAccountActivationEmail', () => { jest.mock('@/mailer/sendAccountActivationEmail', () => {
@ -30,9 +31,10 @@ jest.mock('@/apis/KlicktippController', () => {
*/ */
let mutate: any, query: any, con: any let mutate: any, query: any, con: any
let testEnv: any
beforeAll(async () => { beforeAll(async () => {
const testEnv = await testEnvironment() testEnv = await testEnvironment()
mutate = testEnv.mutate mutate = testEnv.mutate
query = testEnv.query query = testEnv.query
con = testEnv.con con = testEnv.con
@ -312,7 +314,7 @@ describe('UserResolver', () => {
describe('user is in database and correct login data', () => { describe('user is in database and correct login data', () => {
beforeAll(async () => { beforeAll(async () => {
await createUserFactory(mutate, bibiBloxberg) await userFactory(testEnv, bibiBloxberg)
result = await query({ query: login, variables }) result = await query({ query: login, variables })
}) })
@ -349,7 +351,7 @@ describe('UserResolver', () => {
describe('user is in database and wrong password', () => { describe('user is in database and wrong password', () => {
beforeAll(async () => { beforeAll(async () => {
await createUserFactory(mutate, bibiBloxberg) await userFactory(testEnv, bibiBloxberg)
}) })
afterAll(async () => { afterAll(async () => {
@ -387,7 +389,7 @@ describe('UserResolver', () => {
} }
beforeAll(async () => { beforeAll(async () => {
await createUserFactory(mutate, bibiBloxberg) await userFactory(testEnv, bibiBloxberg)
await query({ query: login, variables }) await query({ query: login, variables })
}) })

View File

@ -0,0 +1,7 @@
export interface CreationInterface {
email: string
amount: number
memo: string
creationDate: string
confirmed?: boolean
}

View File

@ -0,0 +1,29 @@
import { CreationInterface } from './CreationInterface'
const lastMonth = (date: Date): string => {
return new Date(date.getFullYear(), date.getMonth() - 1, 1).toISOString()
}
export const creations: CreationInterface[] = [
{
email: 'bibi@bloxberg.de',
amount: 1000,
memo: 'Herzlich Willkommen bei Gradido!',
creationDate: lastMonth(new Date()),
confirmed: true,
},
{
email: 'bob@baumeister.de',
amount: 1000,
memo: 'Herzlich Willkommen bei Gradido!',
creationDate: lastMonth(new Date()),
confirmed: true,
},
{
email: 'raeuber@hotzenplotz.de',
amount: 1000,
memo: 'Herzlich Willkommen bei Gradido!',
creationDate: lastMonth(new Date()),
confirmed: true,
},
]

View File

@ -0,0 +1,38 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { createPendingCreation, confirmPendingCreation } from '@/seeds/graphql/mutations'
import { login } from '@/seeds/graphql/queries'
import { CreationInterface } from '@/seeds/creation/CreationInterface'
import { ApolloServerTestClient } from 'apollo-server-testing'
import { User } from '@entity/User'
import { AdminPendingCreation } from '@entity/AdminPendingCreation'
// import CONFIG from '@/config/index'
export const creationFactory = async (
client: ApolloServerTestClient,
creation: CreationInterface,
): Promise<void> => {
const { mutate, query } = client
// login as Peter Lustig (admin)
await query({ query: login, variables: { email: 'peter@lustig.de', password: 'Aa12345_' } })
// get Peter Lustig's user id
const peterLustig = await User.findOneOrFail({ where: { email: 'peter@lustig.de' } })
const variables = { ...creation, moderator: peterLustig.id }
await mutate({ mutation: createPendingCreation, variables })
// get User
const user = await User.findOneOrFail({ where: { email: creation.email } })
if (creation.confirmed) {
const pendingCreation = await AdminPendingCreation.findOneOrFail({
where: { userId: user.id },
order: { created: 'DESC' },
})
await mutate({ mutation: confirmPendingCreation, variables: { id: pendingCreation.id } })
}
}

View File

@ -1,13 +1,16 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { createUser, setPassword } from '@/seeds/graphql/mutations' import { createUser, setPassword } from '@/seeds/graphql/mutations'
import { User } from '@entity/User' import { User } from '@entity/User'
import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn'
import { ServerUser } from '@entity/ServerUser' import { ServerUser } from '@entity/ServerUser'
import { UserInterface } from '@/seeds/users/UserInterface' import { UserInterface } from '@/seeds/users/UserInterface'
import { ApolloServerTestClient } from 'apollo-server-testing'
export const userFactory = async (
client: ApolloServerTestClient,
user: UserInterface,
): Promise<void> => {
const { mutate } = client
export const createUserFactory = async (mutate: any, user: UserInterface): Promise<void> => {
await mutate({ mutation: createUser, variables: user }) await mutate({ mutation: createUser, variables: user })
let dbUser = await User.findOneOrFail({ where: { email: user.email } }) let dbUser = await User.findOneOrFail({ where: { email: user.email } })

View File

@ -69,3 +69,29 @@ export const createTransactionLink = gql`
} }
} }
` `
// from admin interface
export const createPendingCreation = gql`
mutation (
$email: String!
$amount: Float!
$memo: String!
$creationDate: String!
$moderator: Int!
) {
createPendingCreation(
email: $email
amount: $amount
memo: $memo
creationDate: $creationDate
moderator: $moderator
)
}
`
export const confirmPendingCreation = gql`
mutation ($id: Float!) {
confirmPendingCreation(id: $id)
}
`

View File

@ -7,14 +7,16 @@ import { createTestClient } from 'apollo-server-testing'
import { name, internet, random } from 'faker' import { name, internet, random } from 'faker'
import { users } from './users/index' import { users } from './users/index'
import { createUserFactory } from './factory/user' import { creations } from './creation/index'
import { userFactory } from './factory/user'
import { creationFactory } from './factory/creation'
import { entities } from '@entity/index' import { entities } from '@entity/index'
const context = { const context = {
token: '', token: '',
setHeaders: { setHeaders: {
push: (value: string): void => { push: (value: { key: string; value: string }): void => {
context.token = value context.token = value.value
}, },
// eslint-disable-next-line @typescript-eslint/no-empty-function // eslint-disable-next-line @typescript-eslint/no-empty-function
forEach: (): void => {}, forEach: (): void => {},
@ -38,19 +40,18 @@ const resetEntity = async (entity: any) => {
const run = async () => { const run = async () => {
const server = await createServer(context) const server = await createServer(context)
const testClient = createTestClient(server.apollo) const seedClient = createTestClient(server.apollo)
const { mutate } = testClient
const { con } = server const { con } = server
await cleanDB() await cleanDB()
// seed the standard users // seed the standard users
for (let i = 0; i < users.length; i++) { for (let i = 0; i < users.length; i++) {
await createUserFactory(mutate, users[i]) await userFactory(seedClient, users[i])
} }
// seed 100 random users // seed 100 random users
for (let i = 0; i < 100; i++) { for (let i = 0; i < 100; i++) {
await createUserFactory(mutate, { await userFactory(seedClient, {
firstName: name.firstName(), firstName: name.firstName(),
lastName: name.lastName(), lastName: name.lastName(),
email: internet.email(), email: internet.email(),
@ -58,6 +59,11 @@ const run = async () => {
}) })
} }
// create GDD
for (let i = 0; i < creations.length; i++) {
await creationFactory(seedClient, creations[i])
}
await con.close() await con.close()
} }