Skip to content
Snippets Groups Projects
Commit 627ba79a authored by Antoine Lambert's avatar Antoine Lambert
Browse files

cypress: Generate tests data once and get them through a task

Some cypress tests use input data generated before each test suite.

Some of these data are retrieved by sending HTTP requests to the
Software Heritage Web API, which can take some times, especially
when repeating that processing before each test suite.

So instead of sending those HTTP requests before each test suite,
prefer to do it once and put the test data in global cache. Those
data will then be set to test suite scope through the use of a
custom cypress task.
parent 2b1ae269
No related branches found
No related tags found
No related merge requests found
/**
* Copyright (C) 2019-2020 The Software Heritage developers
* Copyright (C) 2019-2022 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
......@@ -60,7 +60,10 @@ describe('Test File Rendering', function() {
});
it('should have correct url to raw file', function() {
cy.get(`a[href='${origin.content[0].rawFilePath}']`)
const content = origin.content[0];
const rawFileUrl = this.Urls.browse_content_raw(`sha1_git:${content.sha1git}`) +
`?filename=${encodeURIComponent(content.name)}`;
cy.get(`a[href='${rawFileUrl}']`)
.should('be.visible');
});
});
/**
* Copyright (C) 2019 The Software Heritage developers
* Copyright (C) 2019-2022 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
......@@ -8,6 +8,30 @@
const axios = require('axios');
const fs = require('fs');
async function httpGet(url) {
const response = await axios.get(url);
return response.data;
}
async function getMetadataForOrigin(originUrl, baseUrl) {
const originVisitsApiUrl = `${baseUrl}/api/1/origin/${originUrl}/visits`;
const originVisits = await httpGet(originVisitsApiUrl);
const lastVisit = originVisits[0];
const snapshotApiUrl = `${baseUrl}/api/1/snapshot/${lastVisit.snapshot}`;
const lastOriginSnapshot = await httpGet(snapshotApiUrl);
let revision = lastOriginSnapshot.branches.HEAD.target;
if (lastOriginSnapshot.branches.HEAD.target_type === 'alias') {
revision = lastOriginSnapshot.branches[revision].target;
}
const revisionApiUrl = `${baseUrl}/api/1/revision/${revision}`;
const lastOriginHeadRevision = await httpGet(revisionApiUrl);
return {
'directory': lastOriginHeadRevision.directory,
'revision': lastOriginHeadRevision.id,
'snapshot': lastOriginSnapshot.id
};
};
module.exports = (on, config) => {
require('@cypress/code-coverage/task')(on, config);
// produce JSON files prior launching browser in order to dynamically generate tests
......@@ -23,5 +47,84 @@ module.exports = (on, config) => {
});
});
});
on('task', {
getSwhTestsData: async() => {
if (!global.swhTestsData) {
const swhTestsData = {};
swhTestsData.unarchivedRepo = {
url: 'https://github.com/SoftwareHeritage/swh-web',
type: 'git',
revision: '7bf1b2f489f16253527807baead7957ca9e8adde',
snapshot: 'd9829223095de4bb529790de8ba4e4813e38672d',
rootDirectory: '7d887d96c0047a77e2e8c4ee9bb1528463677663',
content: [{
sha1git: 'b203ec39300e5b7e97b6e20986183cbd0b797859'
}]
};
swhTestsData.origin = [{
url: 'https://github.com/memononen/libtess2',
type: 'git',
content: [{
path: 'Source/tess.h'
}, {
path: 'premake4.lua'
}],
directory: [{
path: 'Source',
id: 'cd19126d815470b28919d64b2a8e6a3e37f900dd'
}],
revisions: [],
invalidSubDir: 'Source1'
}, {
url: 'https://github.com/wcoder/highlightjs-line-numbers.js',
type: 'git',
content: [{
path: 'src/highlightjs-line-numbers.js'
}],
directory: [],
revisions: ['1c480a4573d2a003fc2630c21c2b25829de49972'],
release: {
name: 'v2.6.0',
id: '6877028d6e5412780517d0bfa81f07f6c51abb41',
directory: '5b61d50ef35ca9a4618a3572bde947b8cccf71ad'
}
}];
for (const origin of swhTestsData.origin) {
const metadata = await getMetadataForOrigin(origin.url, config.baseUrl);
const directoryApiUrl = `${config.baseUrl}/api/1/directory/${metadata.directory}`;
origin.dirContent = await httpGet(directoryApiUrl);
origin.rootDirectory = metadata.directory;
origin.revisions.push(metadata.revision);
origin.snapshot = metadata.snapshot;
for (const content of origin.content) {
const contentPathApiUrl = `${config.baseUrl}/api/1/directory/${origin.rootDirectory}/${content.path}`;
const contentMetaData = await httpGet(contentPathApiUrl);
content.name = contentMetaData.name.split('/').slice(-1)[0];
content.sha1git = contentMetaData.target;
content.directory = contentMetaData.dir_id;
const rawFileUrl = `${config.baseUrl}/browse/content/sha1_git:${content.sha1git}/raw/?filename=${content.name}`;
const fileText = await httpGet(rawFileUrl);
const fileLines = fileText.split('\n');
content.numberLines = fileLines.length;
if (!fileLines[content.numberLines - 1]) {
// If last line is empty its not shown
content.numberLines -= 1;
}
}
}
global.swhTestsData = swhTestsData;
}
return global.swhTestsData;
}
});
return config;
};
/**
* Copyright (C) 2019-2020 The Software Heritage developers
* Copyright (C) 2019-2022 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
......@@ -8,8 +8,6 @@
import 'cypress-hmr-restarter';
import '@cypress/code-coverage/support';
import {httpGetJson} from '../utils';
Cypress.Screenshot.defaults({
screenshotOnRunFailure: false
});
......@@ -76,103 +74,15 @@ function mockSwhStatusRequest() {
}
before(function() {
this.unarchivedRepo = {
url: 'https://github.com/SoftwareHeritage/swh-web',
type: 'git',
revision: '7bf1b2f489f16253527807baead7957ca9e8adde',
snapshot: 'd9829223095de4bb529790de8ba4e4813e38672d',
rootDirectory: '7d887d96c0047a77e2e8c4ee9bb1528463677663',
content: [{
sha1git: 'b203ec39300e5b7e97b6e20986183cbd0b797859'
}]
};
this.origin = [{
url: 'https://github.com/memononen/libtess2',
type: 'git',
content: [{
path: 'Source/tess.h'
}, {
path: 'premake4.lua'
}],
directory: [{
path: 'Source',
id: 'cd19126d815470b28919d64b2a8e6a3e37f900dd'
}],
revisions: [],
invalidSubDir: 'Source1'
}, {
url: 'https://github.com/wcoder/highlightjs-line-numbers.js',
type: 'git',
content: [{
path: 'src/highlightjs-line-numbers.js'
}],
directory: [],
revisions: ['1c480a4573d2a003fc2630c21c2b25829de49972'],
release: {
name: 'v2.6.0',
id: '6877028d6e5412780517d0bfa81f07f6c51abb41',
directory: '5b61d50ef35ca9a4618a3572bde947b8cccf71ad'
}
}];
mockSwhStatusRequest();
const getMetadataForOrigin = async originUrl => {
const originVisitsApiUrl = this.Urls.api_1_origin_visits(originUrl);
const originVisits = await httpGetJson(originVisitsApiUrl);
const lastVisit = originVisits[0];
const snapshotApiUrl = this.Urls.api_1_snapshot(lastVisit.snapshot);
const lastOriginSnapshot = await httpGetJson(snapshotApiUrl);
let revision = lastOriginSnapshot.branches.HEAD.target;
if (lastOriginSnapshot.branches.HEAD.target_type === 'alias') {
revision = lastOriginSnapshot.branches[revision].target;
}
const revisionApiUrl = this.Urls.api_1_revision(revision);
const lastOriginHeadRevision = await httpGetJson(revisionApiUrl);
return {
'directory': lastOriginHeadRevision.directory,
'revision': lastOriginHeadRevision.id,
'snapshot': lastOriginSnapshot.id
};
};
cy.task('getSwhTestsData').then(testsData => {
Object.assign(this, testsData);
});
cy.visit('/').window().then(async win => {
this.Urls = win.Urls;
for (const origin of this.origin) {
const metadata = await getMetadataForOrigin(origin.url);
const directoryApiUrl = this.Urls.api_1_directory(metadata.directory);
origin.dirContent = await httpGetJson(directoryApiUrl);
origin.rootDirectory = metadata.directory;
origin.revisions.push(metadata.revision);
origin.snapshot = metadata.snapshot;
for (const content of origin.content) {
const contentPathApiUrl = this.Urls.api_1_directory(origin.rootDirectory, content.path);
const contentMetaData = await httpGetJson(contentPathApiUrl);
content.name = contentMetaData.name.split('/').slice(-1)[0];
content.sha1git = contentMetaData.target;
content.directory = contentMetaData.dir_id;
content.rawFilePath = this.Urls.browse_content_raw(`sha1_git:${content.sha1git}`) +
`?filename=${encodeURIComponent(content.name)}`;
cy.request(content.rawFilePath)
.then((response) => {
const fileText = response.body;
const fileLines = fileText.split('\n');
content.numberLines = fileLines.length;
// If last line is empty its not shown
if (!fileLines[content.numberLines - 1]) content.numberLines -= 1;
});
}
}
});
});
......
/**
* Copyright (C) 2019 The Software Heritage developers
* Copyright (C) 2019-2022 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
*/
import axios from 'axios';
export async function httpGetJson(url) {
const response = await axios.get(url);
return response.data;
}
/**
* Converts string with Time information
* to an object with Time information
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment