Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cypress-tests/cypress/support/commands/datasets.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { v4 as uuidv4 } from "uuid";

import { ProjectIdentifier } from "./projects";
import { TIMEOUTS } from "../../../config";

export type DatasetIdentifier = ProjectIdentifier & {
datasetName: string;
Expand Down Expand Up @@ -29,6 +30,9 @@ function searchForDataset(name: string, shouldExist = true) {
.scrollIntoView()
.should("be.visible")
.check();

// wait until search indexing is done, sometimes it takes some more seconds
cy.wait(TIMEOUTS.standard); // eslint-disable-line cypress/no-unnecessary-waiting
cy.get("input[placeholder='Search...']")
.should("be.visible")
.type(name)
Expand Down
110 changes: 82 additions & 28 deletions cypress-tests/cypress/support/commands/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,43 +69,90 @@ interface NewProjectProps extends ProjectIdentifier {
visibility?: "public" | "private" | "internal";
}

interface NewProjectTemplate {
result: {
namespace: string;
slug: string;
project_id: string;
name: string;
}
}

interface Templates {
templates: {
folder: string;
name: string;
}[];
}
function createProjectV1API(newProjectProps: NewProjectProps) {
const resTemplates = getTemplates();
resTemplates.then((response) => {
if (response.result.templates.length === 0) {
throw new Error("No templates found in the manifest");
}
const newProjectBody = {
identifier: response.result.templates[0].folder ?? "python",
project_name: newProjectProps.name,
project_namespace: newProjectProps.namespace,
project_repository: "https://gitlab.dev.renku.ch",
ref: "0.9.0",
url: "https://github.com/SwissDataScienceCenter/renku-project-template",
};
cy.request({
method: "POST",
url: "api/renku/templates.create_project",
body: newProjectBody,
headers: {
"Content-Type": "application/json",
},
}).then((responseProject: Cypress.Response<NewProjectTemplate>) => {
const project = responseProject.body.result;
const identifier = encodeURIComponent(project.namespace + "/" + project.slug);
const updateProjectBody = {
id: identifier,
visibility: newProjectProps.visibility ?? "public",
};
return cy.request({
method: "PUT",
url: "api/projects/" + identifier,
body: updateProjectBody,
headers: {
"Content-Type": "application/json",
},
});
});
});
}

function getTemplates() {
return cy.request({
method: "GET",
url: "api/renku/templates.read_manifest?url=https%3A%2F%2Fgithub.com%2FSwissDataScienceCenter%2Frenku-project-template",
headers: {
"Content-Type": "application/json",
},
}).then((response) => {
if (response.status !== 200) {
throw new Error(`Failed to fetch templates: ${response.statusText}`);
}
return response.body;
});
}


function createProjectIfMissing(newProjectProps: NewProjectProps) {
const namespace = newProjectProps.namespace ?? Cypress.env("TEST_USERNAME");
const slug = encodeURIComponent(`${namespace}/${newProjectProps.name}`);

cy.request({
failOnStatusCode: false,
method: "GET",
url: `/ui-server/api/projects/${slug}`,
}).then((response) => {
}).then(async (response) => {
if (response.status != 200) {
cy.visit("/v1/projects/new");
cy.getDataCy("field-group-title")
.should("be.visible")
.clear()
.type(newProjectProps.name);
if (newProjectProps.namespace) {
cy.get("#namespace-input")
.should("be.visible")
.clear()
.type(newProjectProps.namespace);
}

if (newProjectProps.templateName)
cy.contains(newProjectProps.templateName).should("be.visible").click();

if (newProjectProps.visibility) {
cy.getDataCy(`visibility-${newProjectProps.visibility}`)
.should("be.visible")
.click();
}
// The button may take some time before it is clickable
cy.get("[data-cy=create-project-button]", { timeout: TIMEOUTS.vlong })
.should("be.enabled")
.click();
}
else {
cy.visit(`projects/${namespace}/${newProjectProps.name}`);
await createProjectV1API(newProjectProps);
}
cy.visit(`projects/${ namespace }/${ newProjectProps.name }`);
cy.url({ timeout: TIMEOUTS.vlong }).should(
"contain",
newProjectProps.name.toLowerCase(),
Expand Down Expand Up @@ -272,6 +319,13 @@ function waitMetadataIndexing(justTriggered = true, goToSettings = true) {
}
if (goToSettings) cy.getProjectSection("Settings").click();
cy.getDataCy("kg-status-section-open").click();
// Check if the update button is present and click it
cy.getDataCy("kg-status-section-action-button").then(($el) => {
const updateButton = $el.find("#button-update-projectKnowledgeGraph");
if (updateButton.length) {
cy.wrap(updateButton).click();
}
});
cy.getDataCy("project-settings-knowledge-graph")
.contains("Everything indexed", { timeout: TIMEOUTS.vlong })
.should("be.visible");
Expand Down
Loading