From d4104f641df2b63e3602dcc071b56ff073bbc753 Mon Sep 17 00:00:00 2001 From: Marcel van Remmerden Date: Sun, 27 Mar 2022 05:31:20 +0000 Subject: [PATCH] Prevent a favorite project to be added twice --- myApp.js | 82 ++++++++++++++++++---------------- test/favorite-projects.spec.js | 18 ++++++-- 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/myApp.js b/myApp.js index 1f1ba2f..dab1462 100644 --- a/myApp.js +++ b/myApp.js @@ -1559,46 +1559,52 @@ function addProject(link, target) { if (GitLab.urlHasValidHost(link)) { GitLab.parseUrl(link) .then((object) => { - if (object.type && object.type !== 'projects') { - const projectWithNamespace = encodeURIComponent(link.split(`${store.host}/`)[1]); - GitLab.get(`projects/${projectWithNamespace}`) - .then((project) => { - const projects = store['favorite-projects'] || []; - projects.push({ - id: project.id, - visibility: project.visibility, - web_url: project.web_url, - name: project.name, - title: project.name, - namespace: { - name: project.namespace.name, - }, - parent_name: project.name_with_namespace, - parent_url: project.namespace.web_url, - name_with_namespace: project.name_with_namespace, - open_issues_count: project.open_issues_count, - last_activity_at: project.last_activity_at, - avatar_url: project.avatar_url, - star_count: project.star_count, - forks_count: project.forks_count, + if ( + !store['favorite-projects'].filter((project) => project.web_url === object.web_url).length + ) { + if (object.type && object.type !== 'projects') { + const projectWithNamespace = encodeURIComponent(link.split(`${store.host}/`)[1]); + GitLab.get(`projects/${projectWithNamespace}`) + .then((project) => { + const projects = store['favorite-projects'] || []; + projects.push({ + id: project.id, + visibility: project.visibility, + web_url: project.web_url, + name: project.name, + title: project.name, + namespace: { + name: project.namespace.name, + }, + parent_name: project.name_with_namespace, + parent_url: project.namespace.web_url, + name_with_namespace: project.name_with_namespace, + open_issues_count: project.open_issues_count, + last_activity_at: project.last_activity_at, + avatar_url: project.avatar_url, + star_count: project.star_count, + forks_count: project.forks_count, + }); + store['favorite-projects'] = projects; + if (newTarget === '-settings-') { + openSettingsPage(); + } + displayUsersProjects(projects); + }) + .catch(() => { + displayAddError('project', newTarget); }); - store['favorite-projects'] = projects; - if (newTarget === '-settings-') { - openSettingsPage(); - } - displayUsersProjects(projects); - }) - .catch(() => { - displayAddError('project', newTarget); - }); - } else { - const projects = store['favorite-projects'] || []; - projects.push(object); - store['favorite-projects'] = projects; - if (newTarget === '-settings-') { - openSettingsPage(); + } else { + const projects = store['favorite-projects'] || []; + projects.push(object); + store['favorite-projects'] = projects; + if (newTarget === '-settings-') { + openSettingsPage(); + } + displayUsersProjects(projects); } - displayUsersProjects(projects); + } else { + displayAddError('project', newTarget, 'The same project was already added.'); } }) .catch(() => { diff --git a/test/favorite-projects.spec.js b/test/favorite-projects.spec.js index 1ce43e9..a25ec22 100644 --- a/test/favorite-projects.spec.js +++ b/test/favorite-projects.spec.js @@ -97,12 +97,22 @@ describe('Favorite projects', function () { assert.equal((await listFavoriteProjects(this.window)).length, 0); }); - // Skipped due to https://gitlab.com/mvanremmerden/gitdock/-/issues/110 - it.skip('prevents adding a project twice', async function () { + it('prevents adding a project twice', async function () { + await newApp(this, { + loggedIn: true, + favoriteProjects: [EXAMPLE_PROJECT], + }); + await openSettings(this.window); - await addProject(this.window, EXAMPLE_PROJECT.web_url); - await addProject(this.window, EXAMPLE_PROJECT.web_url); + await this.window.click('#add-project-dialog a'); + await this.window.fill('#project-settings-link', EXAMPLE_PROJECT.web_url); + await this.window.click('#project-settings-add-button'); + await this.window.waitForSelector('#add-project-settings-error'); + + const error = this.window.locator('#add-project-settings-error'); + + assert.equal(await error.innerText(), 'The same project was already added.'); await this.window.click('#detail-header'); await this.window.waitForTimeout(100);