diff --git a/cypress/e2e/admin.cy.js b/cypress/e2e/admin.cy.js index ba8c069..2c8054c 100644 --- a/cypress/e2e/admin.cy.js +++ b/cypress/e2e/admin.cy.js @@ -26,23 +26,6 @@ describe('The admin page', () => { cy.contains('Test Text') }) - it('shows one root node and child node on the seeded text page', () => { - cy.visit('/admin/texts/0') - cy.intercept('GET', '/api/nodes/0').as('getNodes') - cy.wait('@getNodes') - cy.get('#text-detail > ul > li > ul > li').should('have.length', 1) - }) - - it('shows one root node on the text page', () => { - cy.visit('/admin/texts') - cy.get('#newTextName').type('My Node Text') - cy.get('#submit').click() - cy.intercept('GET', '/api/nodes/1').as('getNodes') - cy.get('a').contains('My Node Text').click() - cy.wait('@getNodes') - cy.get('#text-detail > ul').should('have.length', 1) - }) - it('navigates to a specific texts page', () => { cy.visit('/admin/texts') cy.get('#newTextName').type('My New Text') diff --git a/cypress/e2e/adminText.cy.js b/cypress/e2e/adminText.cy.js new file mode 100644 index 0000000..9dae1bf --- /dev/null +++ b/cypress/e2e/adminText.cy.js @@ -0,0 +1,86 @@ +describe('The admin text detail page', () => { + beforeEach(() => { + cy.exec('npm run db:seed') + cy.intercept('GET', '/api/texts/0').as('getText') + cy.intercept('GET', '/api/nodes/0').as('getNodes') + cy.visit('/admin/texts/0') + cy.wait('@getText') + cy.wait('@getNodes') + }) + + afterEach(() => { + cy.exec('npm run db:wipe') + }) + + it('shows the text name as a heading', () => { + cy.get('h1').should('contain', 'test text') + }) + + it('shows the root node', () => { + cy.get('#text-detail li').first().should('contain', 'Chapter 1') + }) + + it('shows a child node under the root node', () => { + cy.get('#text-detail > ul > li > ul > li').should('contain', 'Section 1.1') + }) + + it('shows an "Add child" button on each node', () => { + cy.get('#text-detail li').each(($li) => { + cy.wrap($li).find('button.add-child').should('exist') + }) + }) + + it('clicking "Add child" reveals an inline form', () => { + cy.get('#text-detail li').first().find('button.add-child').click() + cy.get('#text-detail li').first().find('input.child-title').should('be.visible') + cy.get('#text-detail li').first().find('button.save-child').should('be.visible') + }) + + it('can add a child to the root node', () => { + cy.intercept('POST', '/api/nodes').as('createNode') + cy.intercept('GET', '/api/nodes/0').as('getNodesRefresh') + + cy.get('#text-detail > ul > li').first().find('button.add-child').click() + cy.get('#text-detail > ul > li').first().find('input.child-title').type('New Child Node') + cy.get('#text-detail > ul > li').first().find('button.save-child').click() + + cy.wait('@createNode').its('response.statusCode').should('eq', 201) + cy.wait('@getNodesRefresh') + + cy.get('#text-detail li').should('contain', 'New Child Node') + }) + + it('can add a child to a child node', () => { + cy.intercept('POST', '/api/nodes').as('createNode') + cy.intercept('GET', '/api/nodes/0').as('getNodesRefresh') + + cy.get('#text-detail > ul > li > ul > li').first().find('button.add-child').click() + cy.get('#text-detail > ul > li > ul > li').first().find('input.child-title').type('Nested Child Node') + cy.get('#text-detail > ul > li > ul > li').first().find('button.save-child').click() + + cy.wait('@createNode').its('response.statusCode').should('eq', 201) + cy.wait('@getNodesRefresh') + + cy.get('#text-detail li').should('contain', 'Nested Child Node') + }) + + it('newly added child persists after page reload', () => { + cy.intercept('POST', '/api/nodes').as('createNode') + cy.intercept('GET', '/api/nodes/0').as('getNodesRefresh') + + cy.get('#text-detail > ul > li').first().find('button.add-child').click() + cy.get('#text-detail > ul > li').first().find('input.child-title').type('Persistent Child') + cy.get('#text-detail > ul > li').first().find('button.save-child').click() + + cy.wait('@createNode') + cy.wait('@getNodesRefresh') + + cy.intercept('GET', '/api/texts/0').as('getTextReload') + cy.intercept('GET', '/api/nodes/0').as('getNodesReload') + cy.reload() + cy.wait('@getTextReload') + cy.wait('@getNodesReload') + + cy.get('#text-detail li').should('contain', 'Persistent Child') + }) +})