diff --git a/cypress/integration/content-display.spec.js b/cypress/integration/content-display.spec.js --- a/cypress/integration/content-display.spec.js +++ b/cypress/integration/content-display.spec.js @@ -1,5 +1,5 @@ /** - * 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 @@ }); 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'); }); }); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -1,5 +1,5 @@ /** - * 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 @@ }); }); }); + 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; }; diff --git a/cypress/support/index.js b/cypress/support/index.js --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -1,5 +1,5 @@ /** - * 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 @@ } 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; - }); - } - - } }); }); diff --git a/cypress/utils/index.js b/cypress/utils/index.js --- a/cypress/utils/index.js +++ b/cypress/utils/index.js @@ -1,17 +1,10 @@ /** - * 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