add test cases

This commit is contained in:
Hongbo Wu
2024-01-03 12:40:46 +08:00
parent d31c520a90
commit 554c4cee12
4 changed files with 64 additions and 5 deletions

View File

@ -38,6 +38,7 @@ import {
generateDownloadSignedUrl,
generateUploadFilePathName,
} from '../utils/uploads'
import { emptyTrashResolver } from './article'
import { optInFeatureResolver } from './features'
import { uploadImportFileResolver } from './importers/uploadImportFileResolver'
import {
@ -231,6 +232,7 @@ export const functionResolvers = {
updateEmail: updateEmailResolver,
moveToFolder: moveToFolderResolver,
updateNewsletterEmail: updateNewsletterEmailResolver,
emptyTrash: emptyTrashResolver,
},
Query: {
me: getMeUserResolver,
@ -578,4 +580,5 @@ export const functionResolvers = {
...resultResolveTypeResolver('ScanFeeds'),
...resultResolveTypeResolver('MoveToFolder'),
...resultResolveTypeResolver('UpdateNewsletterEmail'),
...resultResolveTypeResolver('EmptyTrash'),
}

View File

@ -1088,7 +1088,7 @@ export const batchDelete = async (criteria: FindOptionsWhere<LibraryItem>) => {
batch_size INT := ${batchSize};
BEGIN
-- Loop through batches
FOR i IN 0..CEIL((${countSql})) * 1.0 / batch_size) - 1 LOOP
FOR i IN 0..CEIL((${countSql}) * 1.0 / batch_size) - 1 LOOP
-- Delete batch
DELETE FROM omnivore.library_item
WHERE id = ANY(

View File

@ -51,7 +51,9 @@ export const createUsers = async (users: DeepPartial<User>[]) => {
export const batchDelete = async (criteria: FindOptionsWhere<User>) => {
const userQb = getRepository(User).createQueryBuilder().where(criteria)
const userCountSql = queryBuilderToRawSql(userQb.select('COUNT(1)'))
const userSubQuery = queryBuilderToRawSql(userQb.select('id INTO user_ids'))
const userSubQuery = queryBuilderToRawSql(
userQb.select('array_agg(id::UUID) into user_ids')
)
const batchSize = 1000
const sql = `
@ -62,12 +64,12 @@ export const batchDelete = async (criteria: FindOptionsWhere<User>) => {
user_ids UUID[];
BEGIN
-- Loop through batches of users
FOR i IN 0..CEIL((${userCountSql})) * 1.0 / batch_size) - 1 LOOP
FOR i IN 0..CEIL((${userCountSql}) * 1.0 / batch_size) - 1 LOOP
-- GET batch of user ids
${userSubQuery} LIMIT batch_size OFFSET i * batch_size;
${userSubQuery} LIMIT batch_size;
-- Loop through batches of items
FOR j IN 0..CEIL((SELECT COUNT(1) FROM omnivore.library_item WHERE user_id = ANY(user_ids))) * 1.0 / batch_size) - 1 LOOP
FOR j IN 0..CEIL((SELECT COUNT(1) FROM omnivore.library_item WHERE user_id = ANY(user_ids)) * 1.0 / batch_size) - 1 LOOP
-- Delete batch of items
DELETE FROM omnivore.library_item
WHERE id = ANY(

View File

@ -2285,4 +2285,58 @@ describe('Article API', () => {
expect(item?.labels?.map((l) => l.name)).to.eql(['Favorites'])
})
})
describe('EmptyTrash API', () => {
const emptyTrashQuery = () => `
mutation {
emptyTrash {
... on EmptyTrashSuccess {
success
}
... on EmptyTrashError {
errorCodes
}
}
}`
let items: LibraryItem[] = []
before(async () => {
// Create some test items
for (let i = 0; i < 5; i++) {
const itemToSave: DeepPartial<LibraryItem> = {
user,
title: 'test item',
readableContent: '<p>test</p>',
slug: '',
originalUrl: `https://blog.omnivore.app/p/empty-trash-${i}`,
deletedAt: new Date(),
state: LibraryItemState.Deleted,
}
const item = await createLibraryItem(itemToSave, user.id)
items.push(item)
}
})
after(async () => {
// Delete all items
await deleteLibraryItemsByUserId(user.id)
})
it('empties the trash', async () => {
let response = await graphqlRequest(
searchQuery('in:trash'),
authToken
).expect(200)
expect(response.body.data.search.pageInfo.totalCount).to.eql(5)
await graphqlRequest(emptyTrashQuery(), authToken).expect(200)
response = await graphqlRequest(
searchQuery('in:trash'),
authToken
).expect(200)
expect(response.body.data.search.pageInfo.totalCount).to.eql(0)
})
})
})