Merge new unit tests for ContributionResolver.

This commit is contained in:
elweyn 2023-02-06 14:34:40 +01:00
parent 46e8a55d2e
commit 8c00fcd6cc
7 changed files with 167 additions and 136 deletions

View File

@ -86,5 +86,8 @@
"> 1%",
"last 2 versions",
"not ie <= 10"
]
],
"nodemonConfig": {
"ignore": ["**/*.spec.js"]
}
}

View File

@ -72,5 +72,8 @@
"ts-node": "^10.0.0",
"tsconfig-paths": "^3.14.0",
"typescript": "^4.3.4"
},
"nodemonConfig": {
"ignore": ["**/*.test.ts"]
}
}

View File

@ -23,7 +23,7 @@ import {
import {
listAllContributions,
listContributions,
listUnconfirmedContributions,
adminListAllContributions,
} from '@/seeds/graphql/queries'
import {
// sendAccountActivationEmail,
@ -1963,11 +1963,11 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
describe('adminListAllContributions', () => {
it('returns an error', async () => {
await expect(
query({
query: listUnconfirmedContributions,
query: adminListAllContributions,
}),
).resolves.toEqual(
expect.objectContaining({
@ -2071,11 +2071,11 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
describe('adminListAllContributions', () => {
it('returns an error', async () => {
await expect(
query({
query: listUnconfirmedContributions,
query: adminListAllContributions,
}),
).resolves.toEqual(
expect.objectContaining({
@ -2665,94 +2665,97 @@ describe('ContributionResolver', () => {
})
})
describe('listUnconfirmedContributions', () => {
describe('adminListAllContributions', () => {
it('returns four pending creations', async () => {
await expect(
query({
query: listUnconfirmedContributions,
query: adminListAllContributions,
}),
).resolves.toEqual(
expect.objectContaining({
data: {
listUnconfirmedContributions: expect.arrayContaining([
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Das war leider zu Viel!',
amount: '200',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.not.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test contribution to delete',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test PENDING contribution update',
amount: '10',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test IN_PROGRESS contribution',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Aktives Grundeinkommen',
amount: '200',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
]),
adminListAllContributions: {
contributionCount: 4,
contributionList: expect.arrayContaining([
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Das war leider zu Viel!',
amount: '200',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Peter',
lastName: 'Lustig',
email: 'peter@lustig.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '800', '500'],
}),
expect.not.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test contribution to delete',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test PENDING contribution update',
amount: '10',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Test IN_PROGRESS contribution',
amount: '100',
moderator: null,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Grundeinkommen',
amount: '500',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
expect.objectContaining({
id: expect.any(Number),
firstName: 'Bibi',
lastName: 'Bloxberg',
email: 'bibi@bloxberg.de',
date: expect.any(String),
memo: 'Aktives Grundeinkommen',
amount: '200',
moderator: admin.id,
creation: ['1000', '1000', '90'],
}),
]),
},
},
}),
)

View File

@ -477,40 +477,39 @@ export class ContributionResolver {
}
@Authorized([RIGHTS.LIST_UNCONFIRMED_CONTRIBUTIONS])
@Query(() => [UnconfirmedContribution])
async listUnconfirmedContributions(@Ctx() context: Context): Promise<UnconfirmedContribution[]> {
const clientTimezoneOffset = getClientTimezoneOffset(context)
const contributions = await getConnection()
@Query(() => ContributionListResult) // [UnconfirmedContribution]
async adminListAllContributions(
@Args()
{ currentPage = 1, pageSize = 3, order = Order.DESC }: Paginated,
@Arg('statusFilter', () => [ContributionStatus], { nullable: true })
statusFilter?: ContributionStatus[],
): Promise<ContributionListResult> {
const where: {
contributionStatus?: FindOperator<string> | null
} = {}
if (statusFilter && statusFilter.length) {
where.contributionStatus = In(statusFilter)
}
const [dbContributions, count] = await getConnection()
.createQueryBuilder()
.select('c')
.from(DbContribution, 'c')
.leftJoinAndSelect('c.messages', 'm')
.where({ confirmedAt: IsNull() })
.andWhere({ deniedAt: IsNull() })
.getMany()
.innerJoinAndSelect('c.user', 'u')
.where(where)
.withDeleted()
.orderBy('c.createdAt', order)
.limit(pageSize)
.offset((currentPage - 1) * pageSize)
.getManyAndCount()
if (contributions.length === 0) {
return []
}
const userIds = contributions.map((p) => p.userId)
const userCreations = await getUserCreations(userIds, clientTimezoneOffset)
const users = await DbUser.find({
where: { id: In(userIds) },
withDeleted: true,
relations: ['emailContact'],
})
return contributions.map((contribution) => {
const user = users.find((u) => u.id === contribution.userId)
const creation = userCreations.find((c) => c.id === contribution.userId)
return new UnconfirmedContribution(
contribution,
user,
creation ? creation.creations : FULL_CREATION_AVAILABLE,
)
})
console.log('dbContributions', dbContributions)
console.log('count', count)
return new ContributionListResult(
count,
dbContributions.map((contribution) => new Contribution(contribution, contribution.user)),
)
}
@Authorized([RIGHTS.ADMIN_DELETE_CONTRIBUTION])

View File

@ -177,6 +177,40 @@ query ($currentPage: Int = 1, $pageSize: Int = 5, $order: Order = DESC, $statusF
contributionCount
contributionList {
id
firstName
lastName
amount
memo
createdAt
confirmedAt
confirmedBy
contributionDate
state
messagesCount
deniedAt
deniedBy
}
}
}
`
// from admin interface
export const adminListAllContributions = gql`
query (
$currentPage: Int = 1
$pageSize: Int = 3
$order: Order = DESC
$statusFilter: [ContributionStatus!]
) {
adminListAllContributions(
currentPage: $currentPage
pageSize: $pageSize
order: $order
statusFilter: $statusFilter
) {
contributionCount
contributionList {
id
firstName
lastName
amount
@ -189,24 +223,7 @@ query ($currentPage: Int = 1, $pageSize: Int = 5, $order: Order = DESC, $statusF
messagesCount
deniedAt
deniedBy
}
}
}
`
// from admin interface
export const listUnconfirmedContributions = gql`
query {
listUnconfirmedContributions {
id
firstName
lastName
email
amount
memo
date
moderator
creation
}
}
}
`

View File

@ -47,5 +47,8 @@
"ts-mysql-migrate": "^1.0.2",
"typeorm": "^0.2.38",
"uuid": "^8.3.2"
},
"nodemonConfig": {
"ignore": ["**/*.test.ts"]
}
}

View File

@ -104,5 +104,8 @@
],
"author": "Gradido-Akademie - https://www.gradido.net/",
"license": "Apache-2.0",
"description": "Gradido, the Natural Economy of Life, is a way to worldwide prosperity and peace in harmony with nature. - Gradido, die Natürliche Ökonomie des lebens, ist ein Weg zu weltweitem Wohlstand und Frieden in Harmonie mit der Natur."
"description": "Gradido, the Natural Economy of Life, is a way to worldwide prosperity and peace in harmony with nature. - Gradido, die Natürliche Ökonomie des lebens, ist ein Weg zu weltweitem Wohlstand und Frieden in Harmonie mit der Natur.",
"nodemonConfig": {
"ignore": ["**/*.spec.js"]
}
}