emilepharand/Babilonia

View on GitHub
tests/e2e/specs/search.cy.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {
    addIdeasDifferentSet,
    clearAndType,
} from '../cy-utils';

describe('The search page', () => {
    it('Lists expressions and allows filtering', () => {
        addIdeasDifferentSet();

        const fr = 'français';
        const en = 'english';
        const es = 'español';

        cy.get('#search-link').click();

        assertNRows(17);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);
        testRow(4, ['1', 'português', 'bom Dia', 'bom Dia', 'Known']);
        testRow(16, ['3', es, 'buenas noches 2', 'buenas noches 2', 'Unknown']);

        filterLanguage(fr);
        assertNRows(4);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);
        testRow(1, ['2', fr, 'bonne nuit', 'bonne nuit', 'Unknown']);
        testRow(2, ['3', fr, 'bonsoir', 'bonsoir', 'Unknown']);
        testRow(3, ['3', fr, 'bonsoir 2', 'bonsoir 2', 'Unknown']);

        filterKnown('Known');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterKnown('Unknown');
        assertNRows(3);
        testRow(0, ['2', fr, 'bonne nuit', 'bonne nuit', 'Unknown']);
        testRow(1, ['3', fr, 'bonsoir', 'bonsoir', 'Unknown']);
        testRow(2, ['3', fr, 'bonsoir 2', 'bonsoir 2', 'Unknown']);

        filterKnown('');

        filterText('2');
        assertNRows(1);
        testRow(0, ['3', fr, 'bonsoir 2', 'bonsoir 2', 'Unknown']);

        filterLanguage('');
        assertNRows(3);
        testRow(0, ['3', fr, 'bonsoir 2', 'bonsoir 2', 'Unknown']);
        testRow(1, ['3', en, 'good evening 2', 'good evening 2', 'Unknown']);
        testRow(2, ['3', es, 'buenas noches 2', 'buenas noches 2', 'Unknown']);

        filterText('à vous');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterText('');
        filterTextWithoutContext('à vous');
        assertNoResult();

        filterText('à vous');
        filterTextWithoutContext('bonjour');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterText('bonjour');
        filterTextWithoutContext('bonjour');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterText('^bonjour');
        filterTextWithoutContext('bonjour');
        assertNoResult();

        cy.get('#regexSearch').check();
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterText('^bonjour$');
        assertNoResult();

        filterText('^bonjour');
        filterTextWithoutContext('^bonjour$');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        filterText('^bonjour .à vous.$');
        assertNRows(1);
        testRow(0, ['1', fr, 'bonjour (à vous)', 'bonjour', 'Known']);

        cy.get('#regexSearch').uncheck();
        assertNoResult();
    });

    it('Clicking on a row opens the idea page', () => {
        addIdeasDifferentSet();
        cy.get('#search-link').click();
        assertNRows(17);
        getRows().eq(6).click();
        cy.url().should('contain', '/ideas/2');
    });

    it('New tab click', () => {
        addIdeasDifferentSet();
        cy.get('#search-link').click();
        assertNRows(17);
        getCellsForRow(6).eq(0).trigger('click', {ctrlKey: true});
        // Cypress can't check if a new tab was opened
        cy.url().should('contain', '/search');
    });
});

function testRow(rowNumber: number, expectedData: string[]) {
    const [ideaId, languageName, text, textWithoutContext, known] = expectedData;
    getCellsForRow(rowNumber).eq(0).should('have.text', ideaId);
    getCellsForRow(rowNumber).eq(1).should('have.text', languageName);
    getCellsForRow(rowNumber).eq(2).should('have.text', text);
    getCellsForRow(rowNumber).eq(3).should('have.text', textWithoutContext);
    getCellsForRow(rowNumber).eq(4).should('have.text', known);
}

function getCellsForRow(n: number) {
    return getRow(n).find('td');
}

function getRow(n: number) {
    return getRows().eq(n);
}

function getRows() {
    return cy.get('#table')
        .find('tbody')
        .find('tr');
}

function filterLanguage(language: string) {
    cy.get('#searchLanguages').select(language);
}

function filterText(text: string) {
    clearAndType('#searchText', text);
}

function filterTextWithoutContext(text: string) {
    clearAndType('#searchTextWithoutContext', text);
}

function filterKnown(known: string) {
    cy.get('#searchKnown').select(known);
}

function assertNRows(n: number) {
    getRows().should('have.length', n);
}

function assertNoResult() {
    getRows().should('have.text', 'No matching records found');
}