Merge pull request #1060 from omnivore-app/fix/integrations-db-permissions

fix/integrations db permissions
This commit is contained in:
Hongbo Wu 2022-11-24 15:09:43 +08:00 committed by GitHub
commit 27a14d5537
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 222 additions and 178 deletions

View file

@ -63,6 +63,18 @@ jobs:
run: |
source ~/.nvm/nvm.sh
yarn install --frozen-lockfile
- name: Database Migration
run: |
yarn workspace @omnivore/db migrate
psql -h localhost -p ${{ job.services.postgres.ports[5432] }} -U postgres -c "CREATE USER app_user WITH ENCRYPTED PASSWORD 'app_pass';GRANT omnivore_user to app_user;"
env:
PG_HOST: localhost
PG_PORT: ${{ job.services.postgres.ports[5432] }}
PG_USER: postgres
PG_PASSWORD: postgres
PG_DB: omnivore_test
ELASTIC_URL: http://localhost:${{ job.services.elastic.ports[9200] }}/
PGPASSWORD: postgres # This is required for the psql command to work without a password prompt
- name: TypeScript, Lint, Tests
run: |
source ~/.nvm/nvm.sh
@ -72,8 +84,8 @@ jobs:
env:
PG_HOST: localhost
PG_PORT: ${{ job.services.postgres.ports[5432] }}
PG_USER: postgres
PG_PASSWORD: postgres
PG_USER: app_user
PG_PASSWORD: app_pass
PG_DB: omnivore_test
PG_POOL_MAX: 10
ELASTIC_URL: http://localhost:${{ job.services.elastic.ports[9200] }}/

View file

@ -2,17 +2,21 @@ import {
Column,
CreateDateColumn,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm'
import { User } from '../user'
@Entity()
export class ContentDisplayReport {
@PrimaryGeneratedColumn('uuid')
id?: string
@Column('text')
userId!: string
@ManyToOne(() => User, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'user_id' })
user!: User
@Column('text')
pageId?: string

View file

@ -20,7 +20,7 @@ export class ContentDisplayReportSubscriber
async afterInsert(event: InsertEvent<ContentDisplayReport>): Promise<void> {
const report = event.entity
const message = `A new content display report was created by:
${report.userId} for URL: ${report.originalUrl}
${report.user.id} for URL: ${report.originalUrl}
${report.reportComment}`
console.log(message)

View file

@ -9,10 +9,12 @@ import { UserDeviceToken } from '../src/entity/user_device_tokens'
import { Label } from '../src/entity/label'
import { Subscription } from '../src/entity/subscription'
import { AppDataSource } from '../src/server'
import { getRepository } from '../src/entity/utils'
import { getRepository, setClaims } from '../src/entity/utils'
import { createUser } from '../src/services/create_user'
import { SnakeNamingStrategy } from 'typeorm-naming-strategies'
import { SubscriptionStatus } from '../src/generated/graphql'
import { Integration } from '../src/entity/integration'
import { FindOptionsWhere } from 'typeorm'
const runMigrations = async () => {
const migrationDirectory = __dirname + '/../../db/migrations'
@ -42,7 +44,8 @@ const runMigrations = async () => {
}
export const createTestConnection = async (): Promise<void> => {
await runMigrations()
// need to manually run migrations before creating the connection
// await runMigrations()
AppDataSource.setOptions({
type: 'postgres',
@ -60,12 +63,11 @@ export const createTestConnection = async (): Promise<void> => {
await AppDataSource.initialize()
}
export const deleteTestUser = async (name: string) => {
await AppDataSource.createQueryBuilder()
.delete()
.from(User)
.where({ email: `${name}@omnivore.app` })
.execute()
export const deleteTestUser = async (userId: string) => {
await AppDataSource.transaction(async (t) => {
await setClaims(t, userId)
await t.getRepository(User).delete(userId)
})
}
export const createTestUser = async (
@ -202,3 +204,40 @@ export const createTestSubscription = async (
status: SubscriptionStatus.Active,
})
}
export const deleteTestLabels = async (
userId: string,
criteria: string[] | FindOptionsWhere<Label>
) => {
await AppDataSource.transaction(async (t) => {
await setClaims(t, userId)
await t.getRepository(Label).delete(criteria)
})
}
export const deleteTestIntegrations = async (
userId: string,
criteria: string[] | FindOptionsWhere<Integration>
) => {
await AppDataSource.transaction(async (t) => {
await setClaims(t, userId)
await t.getRepository(Integration).delete(criteria)
})
}
export const updateTestUser = async (userId: string, update: Partial<User>) => {
await AppDataSource.transaction(async (t) => {
await setClaims(t, userId)
await t.getRepository(User).update(userId, update)
})
}
export const deleteTestDeviceTokens = async (
userId: string,
criteria: string[] | FindOptionsWhere<UserDeviceToken>
) => {
await AppDataSource.transaction(async (t) => {
await setClaims(t, userId)
await t.getRepository(UserDeviceToken).delete(criteria)
})
}

View file

@ -5,7 +5,6 @@ import { hashPassword } from '../../src/utils/auth'
import 'mocha'
describe('Sanitize Directive', () => {
const username = 'fake_user'
const correctPassword = 'fakePassword'
let authToken: string
@ -13,7 +12,7 @@ describe('Sanitize Directive', () => {
before(async () => {
const hashedPassword = await hashPassword(correctPassword)
user = await createTestUser(username, '', hashedPassword)
user = await createTestUser('fake_user', '', hashedPassword)
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -22,7 +21,7 @@ describe('Sanitize Directive', () => {
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Update user with a bio that is too long', () => {

View file

@ -25,8 +25,6 @@ const testAPIKey = (apiKey: string): supertest.Test => {
}
describe('Api Key resolver', () => {
const username = 'fake_user'
let authToken: string
let user: User
let query: string
@ -36,7 +34,7 @@ describe('Api Key resolver', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fake_user')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -46,7 +44,7 @@ describe('Api Key resolver', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('generate api key', () => {

View file

@ -343,14 +343,13 @@ const typeaheadSearchQuery = (keyword: string) => {
}
describe('Article API', () => {
const username = 'fakeUser'
let authToken: string
let user: User
let ctx: PageContext
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -366,7 +365,7 @@ describe('Article API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('CreateArticle', () => {

View file

@ -49,14 +49,13 @@ const createArticleSavingRequestMutation = (url: string) => `
`
describe('ArticleSavingRequest API', () => {
const username = 'fakeUser'
let authToken: string
let user: User
let ctx: PageContext
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -72,7 +71,7 @@ describe('ArticleSavingRequest API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('createArticleSavingRequest', () => {

View file

@ -102,7 +102,6 @@ const mergeHighlightQuery = (
}
describe('Highlights API', () => {
const username = 'fakeUser'
let authToken: string
let user: User
let pageId: string
@ -110,7 +109,7 @@ describe('Highlights API', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -121,7 +120,7 @@ describe('Highlights API', () => {
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
if (pageId) {
await deletePage(pageId, ctx)
}

View file

@ -1,6 +1,6 @@
import 'mocha'
import { User } from '../../src/entity/user'
import { createTestUser, deleteTestUser } from '../db'
import { createTestUser, deleteTestIntegrations, deleteTestUser } from '../db'
import { generateFakeUuid, graphqlRequest, request } from '../util'
import {
IntegrationType,
@ -30,7 +30,7 @@ describe('Integrations resolvers', () => {
})
after(async () => {
await deleteTestUser(loginUser.name)
await deleteTestUser(loginUser.id)
})
describe('setIntegration API', () => {
@ -98,9 +98,7 @@ describe('Integrations resolvers', () => {
})
after(async () => {
await getRepository(Integration).delete({
id: existingIntegration.id,
})
await deleteTestIntegrations(loginUser.id, [existingIntegration.id])
})
it('returns AlreadyExists error code', async () => {
@ -137,7 +135,7 @@ describe('Integrations resolvers', () => {
})
afterEach(async () => {
await getRepository(Integration).delete({
await deleteTestIntegrations(loginUser.id, {
user: { id: loginUser.id },
type: integrationType,
})
@ -199,10 +197,8 @@ describe('Integrations resolvers', () => {
})
after(async () => {
await deleteTestUser(otherUser.name)
await getRepository(Integration).delete({
id: existingIntegration.id,
})
await deleteTestUser(otherUser.id)
await deleteTestIntegrations(loginUser.id, [existingIntegration.id])
})
it('returns Unauthorized error code', async () => {
@ -227,9 +223,7 @@ describe('Integrations resolvers', () => {
})
after(async () => {
await getRepository(Integration).delete({
id: existingIntegration.id,
})
await deleteTestIntegrations(loginUser.id, [existingIntegration.id])
})
context('when enable is false', () => {
@ -328,7 +322,7 @@ describe('Integrations resolvers', () => {
})
after(async () => {
await getRepository(Integration).delete(existingIntegration.id)
await deleteTestIntegrations(loginUser.id, [existingIntegration.id])
})
it('returns all integrations', async () => {

View file

@ -1,4 +1,9 @@
import { createTestLabel, createTestUser, deleteTestUser } from '../db'
import {
createTestLabel,
createTestUser,
deleteTestLabels,
deleteTestUser,
} from '../db'
import {
createTestElasticPage,
generateFakeUuid,
@ -40,7 +45,7 @@ describe('Labels API', () => {
after(async () => {
// clean up
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
describe('GET labels', () => {
@ -56,7 +61,10 @@ describe('Labels API', () => {
after(async () => {
// clean up
await getRepository(Label).delete(labels.map((l) => l.id))
await deleteTestLabels(
user.id,
labels.map((l) => l.id)
)
})
beforeEach(() => {
@ -146,7 +154,7 @@ describe('Labels API', () => {
after(async () => {
// clean up
await getRepository(Label).delete({ name })
await deleteTestLabels(user.id, { name })
})
it('should create label', async () => {
@ -167,7 +175,7 @@ describe('Labels API', () => {
})
after(async () => {
await getRepository(Label).delete(existingLabel.id)
await deleteTestLabels(user.id, [existingLabel.id])
})
it('should return error code LABEL_ALREADY_EXISTS', async () => {
@ -341,7 +349,10 @@ describe('Labels API', () => {
after(async () => {
// clean up
await getRepository(Label).delete(labels.map((l) => l.id))
await deleteTestLabels(
user.id,
labels.map((l) => l.id)
)
await deletePage(page.id, ctx)
})
@ -465,7 +476,7 @@ describe('Labels API', () => {
})
after(async () => {
await getRepository(Label).delete(toUpdateLabel.id)
await deleteTestLabels(user.id, [toUpdateLabel.id])
})
it('should return the updated label', async () => {
@ -541,7 +552,10 @@ describe('Labels API', () => {
after(async () => {
// clean up
await getRepository(Label).delete(labels.map((l) => l.id))
await deleteTestLabels(
user.id,
labels.map((l) => l.id)
)
await deletePage(page.id, ctx)
})
@ -669,7 +683,10 @@ describe('Labels API', () => {
after(async () => {
// clean up
await getRepository(Label).delete(labels.map((l) => l.id))
await deleteTestLabels(
user.id,
labels.map((l) => l.id)
)
})
context('when label exists', () => {

View file

@ -6,19 +6,19 @@ import {
} from '../db'
import { generateFakeUuid, graphqlRequest, request } from '../util'
import { NewsletterEmail } from '../../src/entity/newsletter_email'
import { User } from '../../src/entity/user'
import { expect } from 'chai'
import { DeleteNewsletterEmailErrorCode } from '../../src/generated/graphql'
import 'mocha'
describe('Newsletters API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
let newsletterEmails: NewsletterEmail[]
before(async () => {
// create test user and login
const user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -39,7 +39,7 @@ describe('Newsletters API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Get newsletter emails', () => {

View file

@ -6,8 +6,6 @@ import { User } from '../../src/entity/user'
import { getPageByParam } from '../../src/elastic/pages'
describe('PopularReads API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
@ -28,7 +26,7 @@ describe('PopularReads API', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -38,7 +36,7 @@ describe('PopularReads API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('addPopularRead', () => {

View file

@ -29,7 +29,7 @@ describe('recent_searches resolver', () => {
after(async () => {
// clean up
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
describe('recentSearches API', () => {

View file

@ -12,6 +12,7 @@ import {
} from '../db'
import { expect } from 'chai'
import { Reminder } from '../../src/entity/reminder'
import { User } from '../../src/entity/user'
import {
CreateReminderErrorCode,
ReminderErrorCode,
@ -22,15 +23,14 @@ import 'mocha'
import { Page } from '../../src/elastic/types'
describe('Reminders API', () => {
const username = 'fakeUser'
let authToken: string
let page: Page
let reminder: Reminder
let user: User
before(async () => {
// create test user and login
const user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -44,7 +44,7 @@ describe('Reminders API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Get reminder', () => {

View file

@ -8,15 +8,13 @@ import { expect } from 'chai'
import { getRepository } from '../../src/entity/utils'
describe('Report API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
let page: Page
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -29,7 +27,7 @@ describe('Report API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('reportItem', () => {
@ -60,12 +58,6 @@ describe('Report API', () => {
reportTypes = [ReportType.ContentDisplay]
})
after(async () => {
await getRepository(ContentDisplayReport).delete({
elasticPageId: pageId,
})
})
it('should report an item', async () => {
await graphqlRequest(query, authToken).expect(200)

View file

@ -24,7 +24,7 @@ describe('Rules Resolver', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('set rules', () => {

View file

@ -1,18 +1,15 @@
import {
createTestUser,
deleteTestUser,
} from '../db'
import { createTestUser, deleteTestUser } from '../db'
import { graphqlRequest, request } from '../util'
import 'mocha'
import { User } from '../../src/entity/user'
describe('Send Install Instructions API', () => {
const username = 'fakeUser'
let authToken: string
let user: User
before(async () => {
// create test user and login
const user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -22,7 +19,7 @@ describe('Send Install Instructions API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Send install instructions', () => {

View file

@ -6,15 +6,13 @@ import 'mocha'
import { User } from '../../src/entity/user'
describe('Subscriptions API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
let subscriptions: Subscription[]
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -29,7 +27,7 @@ describe('Subscriptions API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('GET subscriptions', () => {

View file

@ -6,15 +6,13 @@ import { User } from '../../src/entity/user'
import { Page } from '../../src/elastic/types'
describe('Update API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
let page: Page
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -25,7 +23,7 @@ describe('Update API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('update page', () => {

View file

@ -46,14 +46,13 @@ const uploadFileRequest = async (
}
describe('uploadFileRequest API', () => {
const username = 'fakeUser'
let authToken: string
let user: User
let ctx: PageContext
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -68,7 +67,7 @@ describe('uploadFileRequest API', () => {
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('UploadFileRequest', () => {

View file

@ -10,7 +10,6 @@ import { hashPassword } from '../../src/utils/auth'
import 'mocha'
describe('User API', () => {
const username = 'fake_user'
const correctPassword = 'fakePassword'
const anotherUsername = 'newFakeUser'
@ -21,7 +20,7 @@ describe('User API', () => {
before(async () => {
const hashedPassword = await hashPassword(correctPassword)
// create test user and login
user = await createTestUser(username, '', hashedPassword)
user = await createTestUser('fake_user', '', hashedPassword)
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -34,8 +33,8 @@ describe('User API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(anotherUsername)
await deleteTestUser(user.id)
await deleteTestUser(anotherUser.id)
})
describe('Update user', () => {

View file

@ -28,13 +28,12 @@ const deleteAccountRequest = async (authToken: string, userId: string) => {
}
describe('the deleteAccount API', () => {
const username = 'newFakeUser'
let authToken: string
let user: User
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('newFakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -43,7 +42,7 @@ describe('the deleteAccount API', () => {
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
context('deleting a user that exists', () => {

View file

@ -1,6 +1,7 @@
import {
createTestDeviceToken,
createTestUser,
deleteTestDeviceTokens,
deleteTestUser,
getDeviceToken,
} from '../db'
@ -13,15 +14,13 @@ import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity/utils'
describe('Device tokens API', () => {
const username = 'fakeUser'
let authToken: string
let deviceToken: UserDeviceToken
let user: User
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -34,7 +33,7 @@ describe('Device tokens API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Set device token', () => {
@ -68,7 +67,7 @@ describe('Device tokens API', () => {
after(async () => {
// clean up
await getRepository(UserDeviceToken).delete({ user: { id: user.id } })
await deleteTestDeviceTokens(user.id, { user: { id: user.id } })
})
context('when id in input is not null', () => {
@ -176,7 +175,7 @@ describe('Device tokens API', () => {
after(async () => {
// clean up
await getRepository(UserDeviceToken).delete({ token })
await deleteTestDeviceTokens(user.id, { token })
})
it('responds with status code 200 and returns all device tokens', async () => {

View file

@ -12,10 +12,11 @@ import { Link } from '../../src/entity/link'
import { Highlight } from '../../src/entity/highlight'
import 'mocha'
import { getRepository } from '../../src/entity/utils'
import { User } from '../../src/entity/user'
describe('User feed article API', () => {
const existingUsername = 'fakeUser'
let user: User
let authToken: string
let page: Page
let link: Link
@ -23,7 +24,7 @@ describe('User feed article API', () => {
before(async () => {
// create test user and login
const user = await createTestUser(existingUsername)
user = await createTestUser(existingUsername)
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -44,7 +45,7 @@ describe('User feed article API', () => {
after(async () => {
// clean up
await deleteTestUser(existingUsername)
await deleteTestUser(user.id)
})
describe('get shared article', () => {
@ -161,7 +162,8 @@ describe('User feed article API', () => {
})
})
it('should responds SharedArticleSuccess', async () => {
// TODO: add test for shared article when shared article api is ready
xit('should responds SharedArticleSuccess', async () => {
const response = await graphqlRequest(query, authToken).expect(200)
expect(response.body.data.sharedArticle.article.id).to.eql(page.id)
})

View file

@ -8,14 +8,12 @@ import { Webhook } from '../../src/entity/webhook'
import { getRepository } from '../../src/entity/utils'
describe('Webhooks API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -39,7 +37,7 @@ describe('Webhooks API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('Get webhook', () => {

View file

@ -4,10 +4,10 @@ import { expect } from 'chai'
import nock from 'nock'
import 'mocha'
import { env } from '../../src/env'
import { User } from '../../src/entity/user'
describe('/article/save API', () => {
const username = 'fakeUser'
let user: User
let authToken: string
// We need to mock the pupeeteer-parse
@ -17,7 +17,7 @@ describe('/article/save API', () => {
before(async () => {
// create test user and login
const user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -27,7 +27,7 @@ describe('/article/save API', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('POST /article/save', () => {

View file

@ -1,4 +1,4 @@
import { createTestUser, deleteTestUser } from '../db'
import { createTestUser, deleteTestUser, updateTestUser } from '../db'
import { generateFakeUuid, request } from '../util'
import { StatusType } from '../../src/datalayer/user/model'
import { getRepository } from '../../src/entity/utils'
@ -55,7 +55,8 @@ describe('auth router', () => {
})
afterEach(async () => {
await deleteTestUser(username)
const user = await getRepository(User).findOneBy({ name })
await deleteTestUser(user!.id)
})
context('when confirmation email sent', () => {
@ -112,15 +113,17 @@ describe('auth router', () => {
})
context('when user exists', () => {
let user: User
before(async () => {
username = 'Some_username'
const user = await createTestUser(username)
user = await createTestUser(username)
email = user.email
password = 'Some password'
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
it('redirects to sign up page with error code USER_EXISTS', async () => {
@ -170,7 +173,7 @@ describe('auth router', () => {
})
after(async () => {
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
context('when email and password are valid', () => {
@ -196,17 +199,13 @@ describe('auth router', () => {
beforeEach(async () => {
fake = sinon.replace(util, 'sendEmail', sinon.fake.resolves(true))
await getRepository(User).update(user.id, {
status: StatusType.Pending,
})
await updateTestUser(user.id, { status: StatusType.Pending })
email = user.email
password = correctPassword
})
afterEach(async () => {
await getRepository(User).update(user.id, {
status: StatusType.Active,
})
await updateTestUser(user.id, { status: StatusType.Active })
sinon.restore()
})
@ -238,17 +237,13 @@ describe('auth router', () => {
context('when user has no password stored in db', async () => {
before(async () => {
await getRepository(User).update(user.id, {
password: '',
})
await updateTestUser(user.id, { password: '' })
email = user.email
password = user.password!
})
after(async () => {
await getRepository(User).update(user.id, {
password,
})
await updateTestUser(user.id, { password })
})
it('redirects with error code WrongSource', async () => {
@ -289,7 +284,7 @@ describe('auth router', () => {
after(async () => {
sinon.restore()
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
context('when token is valid', () => {
@ -377,16 +372,14 @@ describe('auth router', () => {
})
after(async () => {
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
context('when email is verified', () => {
let fake: (msg: MailDataRequired) => Promise<boolean>
before(async () => {
await getRepository(User).update(user.id, {
status: StatusType.Active,
})
await updateTestUser(user.id, { status: StatusType.Active })
})
context('when reset password email sent', () => {
@ -428,9 +421,7 @@ describe('auth router', () => {
context('when email is not verified', () => {
before(async () => {
await getRepository(User).update(user.id, {
status: StatusType.Pending,
})
await updateTestUser(user.id, { status: StatusType.Pending })
})
it('redirects to email-login page with error code PENDING_VERIFICATION', async () => {
@ -485,7 +476,7 @@ describe('auth router', () => {
})
after(async () => {
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
context('when token is valid', () => {
@ -578,7 +569,8 @@ describe('auth router', () => {
let provider: AuthProvider = 'EMAIL'
afterEach(async () => {
await deleteTestUser(username)
const user = await getRepository(User).findOneBy({ name })
await deleteTestUser(user!.id)
})
it('adds popular reads to the library', async () => {

View file

@ -13,7 +13,6 @@ import * as sendNotification from '../../src/utils/sendNotification'
import * as sendEmail from '../../src/utils/sendEmail'
describe('Emails Router', () => {
const username = 'fakeUser'
const newsletterEmail = 'fakeUser@omnivore.app'
let user: User
@ -21,7 +20,7 @@ describe('Emails Router', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
await createTestNewsletterEmail(user, newsletterEmail)
token = process.env.PUBSUB_VERIFICATION_TOKEN!
@ -29,7 +28,7 @@ describe('Emails Router', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
sinon.restore()
})

View file

@ -7,7 +7,7 @@ import {
PubSubRequestBody,
} from '../../src/datalayer/pubsub'
import { User } from '../../src/entity/user'
import { createTestUser, deleteTestUser } from '../db'
import { createTestUser, deleteTestIntegrations, deleteTestUser } from '../db'
import { Integration, IntegrationType } from '../../src/entity/integration'
import { getRepository } from '../../src/entity/utils'
import { Highlight, Page, PageContext } from '../../src/elastic/types'
@ -85,7 +85,7 @@ describe('Integrations routers', () => {
})
after(async () => {
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
context('when integration not found', () => {
@ -166,7 +166,7 @@ describe('Integrations routers', () => {
})
after(async () => {
await getRepository(Integration).delete(integration.id)
await deleteTestIntegrations(user.id, [integration.id])
await deletePage(page.id, ctx)
})

View file

@ -11,7 +11,6 @@ import { expect } from 'chai'
import { getPageById } from '../../src/elastic/pages'
describe('PDF attachments Router', () => {
const username = 'fakeUser'
const newsletterEmail = 'fakeEmail@omnivore.app'
let user: User
@ -19,7 +18,7 @@ describe('PDF attachments Router', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
await createTestNewsletterEmail(user, newsletterEmail)
authToken = jwt.sign(newsletterEmail, process.env.JWT_SECRET || '')
@ -27,7 +26,7 @@ describe('PDF attachments Router', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('upload', () => {

View file

@ -13,15 +13,13 @@ import { expect } from 'chai'
import 'mocha'
describe('Reminders Router', () => {
const username = 'fakeUser'
let authToken: string
let user: User
let reminder: Reminder
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
const res = await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -35,7 +33,7 @@ describe('Reminders Router', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('trigger reminders', () => {

View file

@ -8,7 +8,6 @@ import { expect } from 'chai'
import nock from 'nock'
describe('Webhooks Router', () => {
const username = 'fakeUser'
const token = process.env.PUBSUB_VERIFICATION_TOKEN || ''
const webhookBaseUrl = 'https://localhost:3000'
const webhookPath = `/webhooks`
@ -18,7 +17,7 @@ describe('Webhooks Router', () => {
before(async () => {
// create test user and login
user = await createTestUser(username)
user = await createTestUser('fakeUser')
await request
.post('/local/debug/fake-user-login')
.send({ fakeEmail: user.email })
@ -32,7 +31,7 @@ describe('Webhooks Router', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
describe('trigger webhooks', () => {

View file

@ -17,6 +17,8 @@ import sinonChai from 'sinon-chai'
import sinon from 'sinon'
import * as util from '../../src/utils/sendEmail'
import { MailDataRequired } from '@sendgrid/helpers/classes/mail'
import { User } from '../../src/entity/user'
import { getRepository } from '../../src/entity/utils'
chai.use(sinonChai)
@ -24,8 +26,14 @@ describe('create user', () => {
context('create a user with an invite', () => {
it('follows the other user in the group', async () => {
after(async () => {
await deleteTestUser(testOwner)
await deleteTestUser(testUser)
const testUser = await getRepository(User).findOneBy({
name: 'testuser',
})
await deleteTestUser(testUser!.id)
const testOwner = await getRepository(User).findOneBy({
name: 'testowner',
})
await deleteTestUser(testOwner!.id)
})
const testOwner = 'testowner'
@ -46,7 +54,10 @@ describe('create user', () => {
it('creates profile when user exists but profile not', async () => {
after(async () => {
await deleteTestUser(name)
const user = await getRepository(User).findOneBy({
name: 'userWithoutProfile',
})
await deleteTestUser(user!.id)
})
const name = 'userWithoutProfile'
@ -71,7 +82,8 @@ describe('create user', () => {
afterEach(async () => {
sinon.restore()
await deleteTestUser(name)
const user = await getRepository(User).findOneBy({ name })
await deleteTestUser(user!.id)
})
it('creates the user with pending status and correct name', async () => {
@ -95,7 +107,8 @@ describe('create user', () => {
after(async () => {
sinon.restore()
await deleteTestUser(name)
const user = await getRepository(User).findOneBy({ name })
await deleteTestUser(user!.id)
})
it('rejects with error', async () => {

View file

@ -13,15 +13,16 @@ import { Label } from '../../src/entity/label'
import { Link } from '../../src/entity/link'
import { labelsLoader } from '../../src/services/labels'
import { getRepository } from '../../src/entity/utils'
import { User } from '../../src/entity/user'
describe('batch get labels from linkIds', () => {
let username = 'testUser'
let user: User
let labels: Label[] = []
let link: Link
before(async () => {
// create test user
const user = await createTestUser(username)
user = await createTestUser('fakeUser')
// Create some test links
const page = await createTestPage()
@ -41,7 +42,7 @@ describe('batch get labels from linkIds', () => {
after(async () => {
// clean up
await deleteTestUser(username)
await deleteTestUser(user.id)
})
it('should return a list of label from one link', async () => {

View file

@ -6,13 +6,19 @@ import { SaveContext, saveEmail } from '../../src/services/save_email'
import { createPubSubClient } from '../../src/datalayer/pubsub'
import { getPageByParam } from '../../src/elastic/pages'
import nock from 'nock'
import { User } from '../../src/entity/user'
describe('saveEmail', () => {
const username = 'fakeUser'
const fakeContent = 'fake content'
let user: User
before(async () => {
// create test user
user = await createTestUser('fakeUser')
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
it('doesnt fail if saved twice', async () => {
@ -21,7 +27,6 @@ describe('saveEmail', () => {
const url = 'https://blog.omnivore.app/fake-url'
const title = 'fake title'
const author = 'fake author'
const user = await createTestUser(username)
const ctx: SaveContext = {
pubsub: createPubSubClient(),
uid: user.id,

View file

@ -12,7 +12,6 @@ import { getPageByParam } from '../../src/elastic/pages'
import nock from 'nock'
describe('saveNewsletterEmail', () => {
const username = 'fakeUser'
const fakeContent = 'fake content'
const title = 'fake title'
const author = 'fake author'
@ -22,7 +21,7 @@ describe('saveNewsletterEmail', () => {
let ctx: SaveContext
before(async () => {
user = await createTestUser(username)
user = await createTestUser('fakeUser')
email = await createNewsletterEmail(user.id)
ctx = {
pubsub: createPubSubClient(),
@ -32,7 +31,7 @@ describe('saveNewsletterEmail', () => {
})
after(async () => {
await deleteTestUser(username)
await deleteTestUser(user.id)
})
it('adds the newsletter to the library', async () => {

View file

@ -113,7 +113,7 @@ describe('isProbablyArticle', () => {
})
after(async () => {
await deleteTestUser(user.name)
await deleteTestUser(user.id)
})
it('returns true when email is signed up with us', async () => {