blob: f81193aa60f7262c283fd7501ac100b68371a2ce [file] [log] [blame]
Marc Kupietz490b0532024-09-05 09:36:21 +02001const puppeteer = require('puppeteer-extra');
2puppeteer.use(require('puppeteer-extra-plugin-user-preferences')({
3 userPrefs: {
4 safebrowsing: {
5 enabled: false,
6 enhanced: false
7 }
8 }
9}));
Marc Kupietz55fc3162022-12-04 16:25:49 +010010const chai = require('chai');
Marc Kupietz4c5a7a52022-12-04 16:56:30 +010011const { afterEach } = require('mocha');
Marc Kupietz55fc3162022-12-04 16:25:49 +010012const assert = chai.assert;
13const should = chai.should();
Marc Kupietz7f1666a2024-07-12 18:35:31 +020014var slack = null;
Marc Kupietz55fc3162022-12-04 16:25:49 +010015
Marc Kupietz0f6c54d2022-12-03 15:32:40 +010016const KORAP_URL = process.env.KORAP_URL || "http://localhost:64543";
Marc Kupietzbfb23012025-06-03 15:47:10 +020017const KORAP_LOGIN = 'KORAP_USERNAME' in process.env ? process.env.KORAP_USERNAME : 'KORAP_LOGIN' in process.env ? process.env.KORAP_LOGIN : "user2"
18const KORAP_PWD = process.env.KORAP_PWD || process.env.KORAP_PASSWORD || "password2";
Marc Kupietz26982382022-12-04 19:02:57 +010019const KORAP_QUERIES = process.env.KORAP_QUERIES || 'geht, [orth=geht & cmc/pos=VVFIN]'
Marc Kupietzc8ffb2b2025-06-12 16:44:23 +020020const KORAP_MIN_TOKENS_IN_CORPUS = parseInt(process.env.KORAP_MIN_TOKENS_IN_CORPUS || "100000", 10);
Marc Kupietz5a73a4d2022-12-04 14:09:58 +010021const korap_rc = require('../lib/korap_rc.js').new(KORAP_URL)
22
Marc Kupietz7f1666a2024-07-12 18:35:31 +020023const slack_webhook = process.env.SLACK_WEBHOOK_URL;
Marc Kupietz4d335a32024-09-04 16:13:48 +020024
Marc Kupietz7f1666a2024-07-12 18:35:31 +020025if (slack_webhook) {
26 slack = require('slack-notify')(slack_webhook);
27}
28
Marc Kupietz5a73a4d2022-12-04 14:09:58 +010029function ifConditionIt(title, condition, test) {
Marc Kupietz55fc3162022-12-04 16:25:49 +010030 return condition ? it(title, test) : it.skip(title + " (skipped)", test)
Marc Kupietz5a73a4d2022-12-04 14:09:58 +010031}
Marc Kupietzc4077822022-12-03 15:32:40 +010032
Marc Kupietz0f6c54d2022-12-03 15:32:40 +010033describe('Running KorAP UI end-to-end tests on ' + KORAP_URL, () => {
Marc Kupietzc4077822022-12-03 15:32:40 +010034
35 before(async () => {
Marc Kupietz69e02802023-11-08 14:37:22 +010036 browser = await puppeteer.launch({
Marc Kupietzbfb23012025-06-03 15:47:10 +020037 headless: "shell",
38 args: [
39 '--no-sandbox',
40 '--disable-setuid-sandbox',
41 '--disable-dev-shm-usage',
42 '--disable-accelerated-2d-canvas',
43 '--no-first-run',
44 '--no-zygote',
45 '--disable-gpu'
46 ]
Marc Kupietz69e02802023-11-08 14:37:22 +010047 })
Marc Kupietzc4077822022-12-03 15:32:40 +010048 page = await browser.newPage()
Marc Kupietz4c5a7a52022-12-04 16:56:30 +010049 await page.setViewport({
Marc Kupietz9e0f5192025-03-09 12:12:16 +010050 width: 1980,
Marc Kupietz4c5a7a52022-12-04 16:56:30 +010051 height: 768,
52 deviceScaleFactor: 1,
Marc Kupietz964e7772025-06-03 15:02:30 +020053 });
Marc Kupietz4d335a32024-09-04 16:13:48 +020054 console.log("Browser version: " + await browser.version() + " started")
Marc Kupietzc4077822022-12-03 15:32:40 +010055 })
56
57 after(async () => {
58 await browser.close()
59 })
60
Marc Kupietz4c5a7a52022-12-04 16:56:30 +010061 afterEach(async function () {
62 if (this.currentTest.state == "failed") {
Marc Kupietz8f7c2042025-06-24 09:55:03 +020063 const screenshotPath = "failed_" + this.currentTest.title.replaceAll(/[ &\/]/g, "_") + '.png';
64 await page.screenshot({ path: screenshotPath });
65
Marc Kupietz7f1666a2024-07-12 18:35:31 +020066 if (slack) {
Marc Kupietz8f7c2042025-06-24 09:55:03 +020067 try {
68 // First send text notification via webhook
69 slack.alert({
70 text: `🚨 Test on ${KORAP_URL} failed: *${this.currentTest.title}*`,
71 attachments: [{
72 color: 'danger',
73 fields: [{
74 title: 'Failed Test',
75 value: this.currentTest.title,
76 short: false
77 }, {
78 title: 'URL',
79 value: KORAP_URL,
80 short: true
81 }]
82 }]
83 });
84 } catch (slackError) {
85 console.error('Failed to send notification to Slack:', slackError.message);
86 }
87 }
88
89 // Try to upload screenshot via Slack Web API if token is available
90 const slackToken = process.env.SLACK_TOKEN;
91 if (slackToken) {
92 try {
93 const { WebClient } = require('@slack/web-api');
94 const fs = require('fs'); const web = new WebClient(slackToken);
95 const channelId = process.env.SLACK_CHANNEL_ID || 'C07CM4JS48H';
96
97 // Upload the file to Slack
98 const result = await web.files.uploadV2({
99 channel_id: channelId,
100 file: fs.createReadStream(screenshotPath),
101 filename: screenshotPath,
102 title: `Screenshot: ${this.currentTest.title}`,
103 initial_comment: `📸 Screenshot of failed test: ${this.currentTest.title} on ${KORAP_URL}`
104 });
105
106 console.log('Screenshot uploaded to Slack successfully');
107
108 } catch (uploadError) {
109 console.error('Failed to upload screenshot to Slack:', uploadError.message);
110 }
Marc Kupietz7f1666a2024-07-12 18:35:31 +0200111 }
Marc Kupietz4c5a7a52022-12-04 16:56:30 +0100112 }
Marc Kupietz964e7772025-06-03 15:02:30 +0200113 })
Marc Kupietz4c5a7a52022-12-04 16:56:30 +0100114
Marc Kupietz5a73a4d2022-12-04 14:09:58 +0100115 it('KorAP UI is up and running',
116 (async () => {
Marc Kupietz9e0f5192025-03-09 12:12:16 +0100117 page.goto(KORAP_URL);
118 await page.waitForNavigation({ waitUntil: 'networkidle2' });
Marc Kupietz5a73a4d2022-12-04 14:09:58 +0100119 const query_field = await page.$("#q-field")
120 assert.isNotNull(query_field, "#q-field not found. Kalamar not running?");
Marc Kupietz55fc3162022-12-04 16:25:49 +0100121 }))
Marc Kupietz5a73a4d2022-12-04 14:09:58 +0100122
123
124 ifConditionIt('Login into KorAP with incorrect credentials fails',
125 KORAP_LOGIN != "",
Marc Kupietzc4077822022-12-03 15:32:40 +0100126 (async () => {
Marc Kupietz0f6c54d2022-12-03 15:32:40 +0100127 const login_result = await korap_rc.login(page, KORAP_LOGIN, KORAP_PWD + "*")
Marc Kupietzc4077822022-12-03 15:32:40 +0100128 login_result.should.be.false
Marc Kupietz55fc3162022-12-04 16:25:49 +0100129 }))
Marc Kupietzc4077822022-12-03 15:32:40 +0100130
Marc Kupietz5a73a4d2022-12-04 14:09:58 +0100131 ifConditionIt('Login into KorAP with correct credentials succeeds',
132 KORAP_LOGIN != "",
Marc Kupietzc4077822022-12-03 15:32:40 +0100133 (async () => {
Marc Kupietz5e45a2f2022-12-03 15:32:40 +0100134 const login_result = await korap_rc.login(page, KORAP_LOGIN, KORAP_PWD)
Marc Kupietzc4077822022-12-03 15:32:40 +0100135 login_result.should.be.true
Marc Kupietz55fc3162022-12-04 16:25:49 +0100136 }))
Marc Kupietzc4077822022-12-03 15:32:40 +0100137
Marc Kupietz0f6c54d2022-12-03 15:32:40 +0100138 it('Can turn glimpse off',
Marc Kupietzc4077822022-12-03 15:32:40 +0100139 (async () => {
Marc Kupietz5e45a2f2022-12-03 15:32:40 +0100140 await korap_rc.assure_glimpse_off(page)
Marc Kupietz55fc3162022-12-04 16:25:49 +0100141 }))
Marc Kupietzc4077822022-12-03 15:32:40 +0100142
Marc Kupietzc8ffb2b2025-06-12 16:44:23 +0200143 it('Corpus statistics show sufficient tokens',
144 (async () => {
145 const tokenCount = await korap_rc.check_corpus_statistics(page, KORAP_MIN_TOKENS_IN_CORPUS);
146 console.log(`Found ${tokenCount} tokens in corpus, minimum required: ${KORAP_MIN_TOKENS_IN_CORPUS}`);
147 tokenCount.should.be.above(KORAP_MIN_TOKENS_IN_CORPUS - 1,
148 `Corpus should have at least ${KORAP_MIN_TOKENS_IN_CORPUS} tokens, but found ${tokenCount}`);
Marc Kupietzae9c7242025-06-24 09:54:37 +0200149 })).timeout(50000)
Marc Kupietzc8ffb2b2025-06-12 16:44:23 +0200150
Marc Kupietz0f6c54d2022-12-03 15:32:40 +0100151 describe('Running searches that should have hits', () => {
Marc Kupietz55fc3162022-12-04 16:25:49 +0100152
153 before(async () => { await korap_rc.login(page, KORAP_LOGIN, KORAP_PWD) })
154
Marc Kupietz0f6c54d2022-12-03 15:32:40 +0100155 KORAP_QUERIES.split(/[;,] */).forEach((query, i) => {
156 it('Search for "' + query + '" has hits',
157 (async () => {
158 await korap_rc.assure_glimpse_off(page)
159 const hits = await korap_rc.search(page, query)
160 hits.should.be.above(0)
161 })).timeout(20000)
162 })
163 })
Marc Kupietz5a73a4d2022-12-04 14:09:58 +0100164
165 ifConditionIt('Logout works',
166 KORAP_LOGIN != "",
Marc Kupietzc4077822022-12-03 15:32:40 +0100167 (async () => {
Marc Kupietz5e45a2f2022-12-03 15:32:40 +0100168 const logout_result = await korap_rc.logout(page)
Marc Kupietzc4077822022-12-03 15:32:40 +0100169 logout_result.should.be.true
Marc Kupietz964e7772025-06-03 15:02:30 +0200170 })).timeout(15000)
Marc Kupietzc4077822022-12-03 15:32:40 +0100171
Marc Kupietz55fc3162022-12-04 16:25:49 +0100172})