diff --git a/backend/src/db/factories.js b/backend/src/db/factories.js index a165979e5..bedf592ed 100644 --- a/backend/src/db/factories.js +++ b/backend/src/db/factories.js @@ -105,12 +105,12 @@ Factory.define('user') }) Factory.define('post') - /*.option('categoryIds', []) + /* .option('categoryIds', []) .option('categories', ['categoryIds'], (categoryIds) => { if (categoryIds.length) return Promise.all(categoryIds.map((id) => neode.find('Category', id))) // there must be at least one category return Promise.all([Factory.build('category')]) - })*/ + }) */ .option('tagIds', []) .option('tags', ['tagIds'], (tagIds) => { return Promise.all(tagIds.map((id) => neode.find('Tag', id))) @@ -147,16 +147,16 @@ Factory.define('post') return language || 'en' }) .after(async (buildObject, options) => { - const [post, author, image, /*categories,*/ tags] = await Promise.all([ + const [post, author, image, /* categories, */ tags] = await Promise.all([ neode.create('Post', buildObject), options.author, options.image, - //options.categories, + // options.categories, options.tags, ]) await Promise.all([ post.relateTo(author, 'author'), - //Promise.all(categories.map((c) => c.relateTo(post, 'post'))), + // Promise.all(categories.map((c) => c.relateTo(post, 'post'))), Promise.all(tags.map((t) => t.relateTo(post, 'post'))), ]) if (image) await post.relateTo(image, 'image') diff --git a/cypress/integration/Admin.TagOverview.feature b/cypress/integration/Admin.TagOverview.feature new file mode 100644 index 000000000..109390111 --- /dev/null +++ b/cypress/integration/Admin.TagOverview.feature @@ -0,0 +1,30 @@ +Feature: Admin tag overview + As a database administrator + I would like to see a overview of all tags and their usage + In order to be able to decide which tags are popular or not + + Background: + Given the following "users" are in the database: + | slug | email | password | id | name | role | termsAndConditionsAgreedVersion | + | admin | admin@example.org | 1234 | admin | Admin-Man | admin | 0.0.4 | + | u1 | u1@example.org | 1234 | u1 | User1 | user | 0.0.4 | + | u2 | u2@example.org | 1234 | u2 | User2 | user | 0.0.4 | + And the following "tags" are in the database: + | id | + | Ecology | + | Nature | + | Democracy | + And the following "posts" are in the database: + | id | title | authorId | tagIds | + | p1 | P1 from U1 | u1 | Nature, Democracy | + | p2 | P2 from U1 | u1 | Ecology, Democracy | + | p3 | P3 from U2 | u2 | Nature, Democracy | + And I am logged in as "admin" + + Scenario: See an overview of tags + When I navigate to page "/admin/hashtags" + Then I can see the following table: + | No. | Hashtags | Users | Posts | + | 1 | #Nature | 2 | 2 | + | 2 | #Democracy | 2 | 3 | + | 3 | #Ecology | 1 | 1 | \ No newline at end of file diff --git a/cypress/integration/Admin.TagOverview/I_can_see_the_following_table.js b/cypress/integration/Admin.TagOverview/I_can_see_the_following_table.js new file mode 100644 index 000000000..9ebe1208c --- /dev/null +++ b/cypress/integration/Admin.TagOverview/I_can_see_the_following_table.js @@ -0,0 +1,16 @@ +import { Then } from "cypress-cucumber-preprocessor/steps"; + +Then('I can see the following table:', table => { + const headers = table.raw()[0] + headers.forEach((expected, i) => { + cy.get('thead th') + .eq(i) + .should('contain', expected) + }) + const flattened = [].concat.apply([], table.rows()) + flattened.forEach((expected, i) => { + cy.get('tbody td') + .eq(i) + .should('contain', expected) + }) +}) \ No newline at end of file diff --git a/cypress/integration/common/.admin.js b/cypress/integration/common/.admin.js deleted file mode 100644 index 346fe64fb..000000000 --- a/cypress/integration/common/.admin.js +++ /dev/null @@ -1,21 +0,0 @@ -import { When, Then } from 'cypress-cucumber-preprocessor/steps' - -/* global cy */ - -When('I navigate to the administration dashboard', () => { - cy.get('.avatar-menu').click() - cy.get('.avatar-menu-popover') - .find('a[href="/admin"]') - .click() -}) - -Then('I can see the following table:', table => { - const headers = table.raw()[0] - headers.forEach((expected, i) => { - cy.get('thead th').eq(i).should('contain', expected) - }) - const flattened = [].concat.apply([], table.rows()) - flattened.forEach((expected, i) => { - cy.get('tbody td').eq(i).should('contain', expected) - }) -}) diff --git a/cypress/integration/common/.post.js b/cypress/integration/common/.post.js deleted file mode 100644 index 41c098890..000000000 --- a/cypress/integration/common/.post.js +++ /dev/null @@ -1,21 +0,0 @@ -import { When, Then } from "cypress-cucumber-preprocessor/steps"; -import locales from '../../../webapp/locales' -import orderBy from 'lodash/orderBy' - -const languages = orderBy(locales, 'name') - -Then("I click on the {string} button", text => { - cy.get("button") - .contains(text) - .click(); -}); - -When("I click on 'Pin post'", (string)=> { - cy.get("a.ds-menu-item-link").contains("Pin post") - .click() -}) - -/* Then('confirm crop', () => { - cy.get('.crop-confirm') - .click() -}) */ \ No newline at end of file diff --git a/cypress/integration/common/.steps.js b/cypress/integration/common/.steps.js index e5a4cf6b4..e18f0d09b 100644 --- a/cypress/integration/common/.steps.js +++ b/cypress/integration/common/.steps.js @@ -18,20 +18,6 @@ const annoyingParams = { password: "1234", }; -Given("I log in as {string}", name => { - cy.logout() - cy.neode() - .first("User", { - name - }) - .then(user => { - return new Cypress.Promise((resolve, reject) => { - return user.toJson().then((user) => resolve(user)) - }) - }) - .then(user => cy.login(user)) -}) - Given("the {string} user searches for {string}", (_, postTitle) => { cy.logout() cy.neode() @@ -49,54 +35,8 @@ Given("the {string} user searches for {string}", (_, postTitle) => { .type(postTitle); }); -Given("we have a selection of categories", () => { - cy.factory().build('category', { id: "cat0", slug: "just-for-fun" }); -}); - -Given("we have a selection of tags and categories as well as posts", () => { - cy.factory() - .build('category', { id: 'cat12', name: "Just For Fun", icon: "smile", }) - .build('category', { id: 'cat121', name: "Happiness & Values", icon: "heart-o"}) - .build('category', { id: 'cat122', name: "Health & Wellbeing", icon: "medkit"}) - .build("tag", { id: "Ecology" }) - .build("tag", { id: "Nature" }) - .build("tag", { id: "Democracy" }) - .build("user", { id: 'a1' }) - .build("post", {}, { - authorId: 'a1', - tagIds: ["Ecology", "Nature", "Democracy"], - categoryIds: ["cat12"] - }) - .build("post", {}, { - authorId: 'a1', - tagIds: ["Nature", "Democracy"], - categoryIds: ["cat121"] - }) - .build("user", { id: 'a2' }) - .build("post", {}, { - authorId: 'a2', - tagIds: ['Nature', 'Democracy'], - categoryIds: ["cat12"] - }) - .build("post", {}, { - tagIds: ['Democracy'], - categoryIds: ["cat122"] - }) -}); - -Given("my user account has the role {string}", role => { - cy.factory().build("user", { - role, - ...termsAndConditionsAgreedVersion, - }, /*loginCredentials*/ 'TODO'); -}); - When("I log out", cy.logout); -When("I visit {string}", page => { - cy.openPage(page); -}); - When("a blocked user visits the post page of one of my authored posts", () => { cy.logout() cy.neode() @@ -112,10 +52,6 @@ When("a blocked user visits the post page of one of my authored posts", () => { cy.openPage('post/previously-created-post') }) -Given("I am on the {string} page", page => { - cy.openPage(page); -}); - When("I select {string} in the language menu", name => { cy.switchLanguage(name, true); }); diff --git a/cypress/integration/common/the_following_{string}_are_in_the_database.js b/cypress/integration/common/the_following_{string}_are_in_the_database.js index a6462092b..547166a91 100644 --- a/cypress/integration/common/the_following_{string}_are_in_the_database.js +++ b/cypress/integration/common/the_following_{string}_are_in_the_database.js @@ -3,30 +3,33 @@ import { Given } from "cypress-cucumber-preprocessor/steps"; Given("the following {string} are in the database:", (table,data) => { switch(table){ case "posts": - data.hashes().forEach((attributesOrOptions, i) => { + data.hashes().forEach( entry => { cy.factory().build("post", { - ...attributesOrOptions, - deleted: Boolean(attributesOrOptions.deleted), - disabled: Boolean(attributesOrOptions.disabled), - pinned: Boolean(attributesOrOptions.pinned), - }, - attributesOrOptions, - ); + ...entry, + deleted: Boolean(entry.deleted), + disabled: Boolean(entry.disabled), + pinned: Boolean(entry.pinned), + },{ + ...entry, + tagIds: entry.tagIds.split(',').map(item => item.trim()), + }); }) break case "comments": - data.hashes().forEach((attributesOrOptions, i) => { - cy.factory().build("comment", - attributesOrOptions, - attributesOrOptions, - ); + data.hashes().forEach( entry => { + cy.factory() + .build("comment",entry,entry); }) break case "users": - data.hashes().forEach(params => { - cy.factory().build("user", - params, - params); + data.hashes().forEach( entry => { + cy.factory().build("user",entry,entry); }); + break + case "tags": + data.hashes().forEach( entry => { + cy.factory().build("tag", entry, entry) + }); + break } }) \ No newline at end of file