diff --git a/.github/workflows/devs.yml b/.github/workflows/devs.yml index 6f69ce4..0a5116f 100644 --- a/.github/workflows/devs.yml +++ b/.github/workflows/devs.yml @@ -35,6 +35,7 @@ jobs: run: | cat < .env APP_ENV=TEST + NEXTAUTH_URL=http://localhost:3000 REDIS_DB_ADDRESS=localhost REDIS_DB_PORT=6379 REDIS_DB_PASSWORD= diff --git a/cypress.config.ts b/cypress.config.ts index 4480402..9316d7e 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -43,6 +43,7 @@ export default defineConfig({ }, env: { APP_ENV: "TEST", + DCUP_PARSER: "http://localhost:9000", NEXT_PUBLIC_GOOGLE_CLIENT_ID: "xxxxxxxxx", GOOGLE_CLIENT_SECRET: "xxxxx", NEXT_PUBLIC_GOOGLE_API_KEY: "xxx", diff --git a/cypress/e2e/connections.cy.ts b/cypress/e2e/connections.cy.ts index 48cc489..696de33 100644 --- a/cypress/e2e/connections.cy.ts +++ b/cypress/e2e/connections.cy.ts @@ -22,7 +22,7 @@ describe('connect to google drive', () => { .location('pathname') .should('eq', '/') // create new connection - cy.intercept("GET", "https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&prompt=consent&response_type=code&client_id=195646197640-f2guf0p5q1ueb7jpu1tarrcvlr2bvn65.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fconnections%2Fgoogle-drive%2Fcallback", (res) => { + cy.intercept("GET", "https://accounts.google.com/o/oauth2/v2/auth*", (res) => { res.reply(200, "OK") }).as("googleAuth") @@ -43,7 +43,18 @@ describe('connect to google drive', () => { cy.task('deleteUser', { email: fakeUser.email }) }) - it('should create a new Google Drive connection, show it on the dashboard, and delete it', () => { + + it('connect and config with no settings and delete ( 0 file ) , check the database', () => { + cy.task('getConnection', { email: fakeUser.email }) + .then(res => { + const { conns } = res as { conns: typeof connections.$inferSelect[] } + cy.visit('/connections') + .get(`[data-test="btn-config-${conns[0].identifier}"]`) + .click() + .get(`[data-test="btn-config-connection"]`) + .click() + }).wait(10000) + cy.task('getConnection', { email: fakeUser.email }) .then(res => { const { conns } = res as { conns: typeof connections.$inferSelect[] } @@ -54,6 +65,12 @@ describe('connect to google drive', () => { .within(() => { cy.contains(conns[0].identifier).should('exist'); }); + + expect(conns[0].service).eq("GOOGLE_DRIVE") + expect(conns[0].metadata).eq("{}") + expect(conns[0].limitPages).to.be.null + expect(conns[0].limitFiles).to.be.null + cy.visit('/connections') .get(`[data-test="btn-delete-${conns[0].identifier}"]`) .click() @@ -75,17 +92,61 @@ describe('connect to google drive', () => { .should('not.exist') }); - it("should start processing without configuration", () => { + it("connect and config with settings and delete (0 file), check the database", () => { cy.task('getConnection', { email: fakeUser.email }) .then(res => { const { conns } = res as { conns: typeof connections.$inferSelect[] } - cy.visit('/connections') .get(`[data-test="btn-config-${conns[0].identifier}"]`) .click() + .get('input[name="connectionName"]') + .clear() + .type("testing_connection") + .get('textarea[name="metadata"]') + .clear() + .type('{"job": "my test files"}', { parseSpecialCharSequences: false }) + .get('input[name="documentLimit"]') + .type('2') + .get('input[name="pageLimit"]') + .type('5') .get(`[data-test="btn-config-connection"]`) .click() - // todo intercept with msw https://www.googleapis.com/drive/v3/files + }).wait(10000) + cy.task('getConnection', { email: fakeUser.email }) + .then(res => { + const { conns } = res as { conns: typeof connections.$inferSelect[] } + cy.visit("/") + .contains(/google drive/i) + .should('exist') + .parent() + .within(() => { + cy.contains(conns[0].identifier).should('exist'); + }); + + expect(conns[0].service).eq("GOOGLE_DRIVE") + expect(conns[0].metadata).eq('{"job": "my test files"}') + expect(conns[0].limitPages).eq(5) + expect(conns[0].limitFiles).eq(2) + + cy.visit('/connections') + .get(`[data-test="btn-delete-${conns[0].identifier}"]`) + .click() + .get(`[data-test="delete-connection-btn"]`) + .click() + + cy.get('[data-test="delete-connection-btn"]', { timeout: 15000 }) + .should('not.exist'); + cy.get(`[data-test="btn-delete-${conns[0].identifier}"]`, { timeout: 15000 }) + .should('not.exist') }) + + cy.task('getConnection', { email: fakeUser.email }) + .then(res => { + const { conns } = res as { conns: typeof connections.$inferSelect[] } + expect(conns).to.have.length(0); + }) + cy.visit("/") + .contains(/google drive/i) + .should('not.exist') }) }) diff --git a/mocks/handlers.ts b/mocks/handlers.ts index 9061a1c..7f73f6d 100644 --- a/mocks/handlers.ts +++ b/mocks/handlers.ts @@ -1,6 +1,52 @@ -import { http, HttpResponse } from 'msw' +import { http, HttpResponse, } from 'msw' +const mockDriveFiles = [ + { + id: '1', + name: 'doc1.pdf', + fileExtension: 'pdf', + mimeType: 'application/pdf', + }, +]; +const base64Pdf = `JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9UaXRsZSAoZG9jMSkKL1Byb2R1Y2VyIChTa2lhL1BERiBtMTM3IEdvb2dsZSBEb2NzIFJlbmRlcmVyKT4+CmVuZG9iagozIDAgb2JqCjw8L2NhIDEKL0JNIC9Ob3JtYWw+PgplbmRvYmoKNSAwIG9iago8PC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggNTM2Pj4gc3RyZWFtCnicrVXbbtNAEH33V+wPdLJz25mRokg0LYWHSoDyB4VWQuKB8v8S6zjgXLwlDomjxNmTPT5nbosp1+sG64cFpacf3c8OTLerf77rIqb++vKQhpvXl27xwOnlV9fjjiVh1pJev3XP3ecjBqP+XTnydqlyDDcjx+IDpuVy8bj+eFfXV6vbu3V3u+kW7yWxQOlfnjbPHY5aEZAFESVteuIbRmAn739/Tcuc2VZp871DA6YSpVczAOIDEEAmqCOgZdzhSHvAQBVQyAsWHqnWW8CgRGh2G3dg4xnybgvcb2bZwxzgVZ/Fqc/MFzFWacJCUU4ZlVvirQXERRpKDRwiEV7NlRkQh8sMU6oDgKCSPdMIUMttq04OK4vjjMpqUu1XFu1THVSW/WdhsQg4K7+VgIlu7uux/jv7m019/7juFp/+9jUe9jXu9NmRPhALR6uWh75Grk6Nhf0sZcQQ5Cw6RxpdXdocJoFsGKY2wUi7lsugLjXj4+zRodgcUBGz+QjkYQtBTZBZPgtZXyJcBVQ5k1wtFOp1xuoEHfNuBJtpyTJ2aTtAdDyUzlLgBsE2JeEyR0GQc4iVCcbdIDmdCtRKLbaAIQpjJR2NpPlUM22iZMiu4Xy1yGGdTagWGlOhi4bhduz0IhEFgeqZ7349X0WBmUuZapsLEtkqoibT0Ov1yVpQgv9dEidny1k+64wBRe1P9zdneD+LfwMJrCfCCmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iago8PC9UeXBlIC9QYWdlCi9SZXNvdXJjZXMgPDwvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0KL0V4dEdTdGF0ZSA8PC9HMyAzIDAgUj4+Ci9Gb250IDw8L0Y0IDQgMCBSPj4+PgovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovQ29udGVudHMgNSAwIFIKL1N0cnVjdFBhcmVudHMgMAovVGFicyAvUwovUGFyZW50IDYgMCBSPj4KZW5kb2JqCjYgMCBvYmoKPDwvVHlwZSAvUGFnZXMKL0NvdW50IDEKL0tpZHMgWzIgMCBSXT4+CmVuZG9iago3IDAgb2JqCjw8L2gucHVqNXhlZDBkbmE3IFsyIDAgUiAvWFlaIDcyIDcyMCAwXT4+CmVuZG9iagoxMCAwIG9iago8PC9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9IMQovUCA5IDAgUgovUGcgMiAwIFIKL0sgMD4+CmVuZG9iagoxMSAwIG9iago8PC9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9QCi9QIDkgMCBSCi9QZyAyIDAgUgovSyAxPj4KZW5kb2JqCjEyIDAgb2JqCjw8L1R5cGUgL1N0cnVjdEVsZW0KL1MgL1AKL1AgOSAwIFIKL1BnIDIgMCBSCi9LIDI+PgplbmRvYmoKOSAwIG9iago8PC9UeXBlIC9TdHJ1Y3RFbGVtCi9TIC9Eb2N1bWVudAovUCA4IDAgUgovSyBbMTAgMCBSIDExIDAgUiAxMiAwIFJdPj4KZW5kb2JqCjEzIDAgb2JqClsxMCAwIFIgMTEgMCBSIDEyIDAgUl0KZW5kb2JqCjE0IDAgb2JqCjw8L1R5cGUgL1BhcmVudFRyZWUKL051bXMgWzAgMTMgMCBSXT4+CmVuZG9iago4IDAgb2JqCjw8L1R5cGUgL1N0cnVjdFRyZWVSb290Ci9LIDkgMCBSCi9QYXJlbnRUcmVlTmV4dEtleSAxCi9QYXJlbnRUcmVlIDE0IDAgUj4+CmVuZG9iagoxNiAwIG9iago8PC9UaXRsZSAoVGVzdGluZyBwZGYgcHJvY2Vzc2luZyApCi9EZXN0IFsyIDAgUiAvWFlaIDcyLjYwOTM3NSA3MTQuNTQxMDIgMF0KL1BhcmVudCAxNSAwIFIKL1NFIDEwIDAgUj4+CmVuZG9iagoxNSAwIG9iago8PC9UeXBlIC9PdXRsaW5lcwovRmlyc3QgMTYgMCBSCi9MYXN0IDE2IDAgUgovQ291bnQgMT4+CmVuZG9iagoxNyAwIG9iago8PC9UeXBlIC9DYXRhbG9nCi9QYWdlcyA2IDAgUgovRGVzdHMgNyAwIFIKL01hcmtJbmZvIDw8L1R5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` +const binaryPdf = Buffer.from(base64Pdf, 'base64'); + +export const scenarios = { + zeroFile: [ + http.get('https://www.googleapis.com/drive/v3/files', () => { + return HttpResponse.json({ + files: [] + }) + }), + ], + oneFile: [ + http.get('https://www.googleapis.com/drive/v3/files', () => { + return HttpResponse.json({ + files: [mockDriveFiles[0]] + }) + }), + ], + manyFiles: [ + http.get('https://www.googleapis.com/drive/v3/files', () => { + return HttpResponse.json({ + files: mockDriveFiles + }) + }), + ] +} export const handlers = [ + http.get("https://www.googleapis.com/drive/v3/files/:fileId", ({ params }) => { + const fileId = params.fileId; + const file = mockDriveFiles.find((f) => f.id === fileId); + if (!file) return HttpResponse.json({}, { status: 404 }) + const stream = new ReadableStream({ + start(controller) { + controller.enqueue(binaryPdf); + controller.close(); + } + }); + return new HttpResponse(stream) + }), http.post('https://oauth2.googleapis.com/token', () => { return HttpResponse.json({ access_token: 'FAKE_ACCESS_TOKEN', diff --git a/mocks/server.ts b/mocks/server.ts index e0516f8..db3ab3a 100644 --- a/mocks/server.ts +++ b/mocks/server.ts @@ -1,4 +1,4 @@ import { setupServer } from 'msw/node'; -import { handlers } from './handlers'; -export const mockServer = setupServer(...handlers); +import { handlers, scenarios } from './handlers'; +export const mockServer = setupServer(...scenarios['zeroFile'], ...handlers);