Skip to content

Commit fafd5a9

Browse files
author
MMelchor
committed
test: [#229] E2E test for deleting tags
1 parent 9863626 commit fafd5a9

File tree

7 files changed

+141
-1
lines changed

7 files changed

+141
-1
lines changed

cypress.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineConfig } from "cypress";
22
import { grantAdminRole, deleteUser } from "./cypress/e2e/contexts/user/tasks";
33
import { deleteTorrent } from "./cypress/e2e/contexts/torrent/tasks";
44
import { deleteCategory, addCategory } from "./cypress/e2e/contexts/category/tasks";
5+
import { deleteTag, addTag } from "./cypress/e2e/contexts/tag/tasks";
56
import { DatabaseConfig } from "./cypress/e2e/common/database";
67

78
function databaseConfig (config: Cypress.PluginConfigOptions): DatabaseConfig {
@@ -22,6 +23,13 @@ export default defineConfig({
2223
addCategory: ({ name }) => {
2324
return addCategory(name, databaseConfig(config));
2425
},
26+
// Tag context
27+
deleteTag: ({ name }) => {
28+
return deleteTag(name, databaseConfig(config));
29+
},
30+
addTag: ({ name }) => {
31+
return addTag(name, databaseConfig(config));
32+
},
2533
// Torrent context
2634
deleteTorrent: ({ infohash }) => {
2735
return deleteTorrent(infohash, databaseConfig(config));
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Custom commands for tag context
2+
3+
Cypress.Commands.add("delete_tag_from_database", (name) => {
4+
cy.task("deleteTag", { name });
5+
});
6+
7+
Cypress.Commands.add("add_tag_to_database", (name) => {
8+
cy.task("addTag", { name });
9+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export function random_tag_name (): string {
2+
return `tag-${random_tag_id()}`;
3+
}
4+
5+
function random_tag_id (): number {
6+
return Math.floor(Math.random() * 1000000);
7+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { RegistrationForm, random_user_registration_data } from "../../user/registration";
2+
import { random_tag_name } from "../fixtures";
3+
4+
describe("The admin user", () => {
5+
let registration_form: RegistrationForm;
6+
7+
before(() => {
8+
registration_form = random_user_registration_data();
9+
cy.register_as_admin_and_login(registration_form);
10+
});
11+
12+
after(() => {
13+
cy.delete_user_from_database(registration_form.username);
14+
});
15+
16+
it("should be able to delete a tag", () => {
17+
const tag_name = random_tag_name();
18+
19+
cy.add_tag_to_database(tag_name);
20+
21+
cy.go_to_settings();
22+
23+
// Click tags tab
24+
cy.contains("a", "tags").click();
25+
26+
// Delete the tag
27+
cy.get(`button[data-cy="delete-tag-${tag_name}"]`).click();
28+
29+
// Confirm alert should pop up
30+
cy.on("window:confirm", (str) => {
31+
expect(str).to.equal(`Are you sure you want to delete ${tag_name}?`);
32+
});
33+
34+
// Confirm delete
35+
cy.on("window:confirm", () => true);
36+
37+
cy.get(`[data-cy="delete-tag-${tag_name}"]`).should("not.exist");
38+
});
39+
});
40+
41+
describe("A non admin authenticated user", () => {
42+
let registration_form: RegistrationForm;
43+
44+
before(() => {
45+
registration_form = random_user_registration_data();
46+
cy.register_and_login(registration_form);
47+
});
48+
49+
after(() => {
50+
cy.delete_user_from_database(registration_form.username);
51+
});
52+
53+
it("should not be able to delete tags", () => {
54+
cy.visit("/admin/settings/tags");
55+
cy.contains("Please login to manage admin settings.");
56+
});
57+
});
58+
59+
describe("A guest user", () => {
60+
it("should not be able to delete a tag", () => {
61+
cy.visit("/admin/settings/tags");
62+
cy.contains("Please login to manage admin settings.");
63+
});
64+
});

cypress/e2e/contexts/tag/tasks.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Custom tasks for tag context
2+
3+
import { DatabaseConfig, DatabaseQuery, runDatabaseQuery } from "../../common/database";
4+
5+
// Task to delete a tag
6+
export const deleteTag = async (name: string, db_config: DatabaseConfig): Promise<string> => {
7+
try {
8+
const result = await runDatabaseQuery(deleteTagQuery(name), db_config);
9+
return name;
10+
} catch (err) {
11+
return await Promise.reject(err);
12+
}
13+
};
14+
15+
// Task to add a new tag
16+
export const addTag = async (name: string, db_config: DatabaseConfig): Promise<string> => {
17+
try {
18+
const result = await runDatabaseQuery(addTagQuery(name), db_config);
19+
return name;
20+
} catch (err) {
21+
return await Promise.reject(err);
22+
}
23+
};
24+
25+
// Database query specifications
26+
27+
function deleteTagQuery (name: string): DatabaseQuery {
28+
return {
29+
query: "DELETE FROM torrust_torrent_tags WHERE name = ?",
30+
params: [name]
31+
};
32+
}
33+
34+
function addTagQuery (name: string): DatabaseQuery {
35+
return {
36+
query: "INSERT INTO torrust_torrent_tags (name) VALUES (?)",
37+
params: [name]
38+
};
39+
}

cypress/support/commands.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import "../e2e/contexts/user/commands";
22
import "../e2e/contexts/torrent/commands";
33
import "../e2e/contexts/category/commands";
4+
import "../e2e/contexts/tag/commands";
45
import "../e2e/common/commands";
56
import { TestTorrentInfo } from "cypress/e2e/contexts/torrent/test_torrent_info";
67
import { RegistrationForm } from "../e2e/contexts/user/registration";
@@ -31,6 +32,10 @@ declare global {
3132
// Category context
3233
delete_category_from_database(name: string): Chainable<void>
3334
add_category_to_database(name: string): Chainable<void>
35+
36+
// Tag context
37+
delete_tag_from_database(name: string): Chainable<void>
38+
add_tag_to_database(name: string): Chainable<void>
3439
}
3540
}
3641
}

pages/admin/settings/tags.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<template v-for="tag in tags">
55
<div class="flex justify-between p-2 rounded bg-base-100">
66
<span class="text-base-content">{{ tag.name }}</span>
7-
<button class="text-error-content hover:text-error" @click="deleteTag(tag)">
7+
<button :data-cy="getDeleteButtonDataCy(tag.name)" class="text-error-content hover:text-error" @click="deleteTag(tag)">
88
Delete
99
</button>
1010
</div>
@@ -31,6 +31,14 @@ const rest = useRestApi().value;
3131
const newTag = ref("");
3232
const addingTag = ref(false);
3333
34+
onBeforeMount(() => {
35+
getTags();
36+
});
37+
38+
function getDeleteButtonDataCy (name: string) {
39+
return "delete-tag-" + name.toLowerCase().replace(/ /g, "-");
40+
}
41+
3442
function addTag () {
3543
if (newTag.value) {
3644
addingTag.value = true;

0 commit comments

Comments
 (0)