diff --git a/backend/tests/Feature/ElementsEndpointTest.php b/backend/tests/Feature/ElementsEndpointTest.php index 329e932..3f21172 100644 --- a/backend/tests/Feature/ElementsEndpointTest.php +++ b/backend/tests/Feature/ElementsEndpointTest.php @@ -94,6 +94,7 @@ class ElementsEndpointTest extends TestCase 'longPdfPath' => '/assets/pdfs/baderech-long.pdf', 'youtubeUrl' => $sampleYoutubeUrl, ], + 'parentElement' => null, 'siblingElements' => [ [ 'id' => $element->getId(), @@ -151,6 +152,11 @@ class ElementsEndpointTest extends TestCase ); $response->assertOk(); + $response->assertJsonPath('parentElement', [ + 'id' => $parentElement->getId(), + 'title' => 'Baderech HaAvodah', + 'description' => 'A structured path for growth', + ]); $response->assertJsonPath('siblingElements', [ [ 'id' => $firstChildElement->getId(), diff --git a/backend/tests/Unit/Controllers/ElementControllerTest.php b/backend/tests/Unit/Controllers/ElementControllerTest.php index 7704306..1ebcb9c 100644 --- a/backend/tests/Unit/Controllers/ElementControllerTest.php +++ b/backend/tests/Unit/Controllers/ElementControllerTest.php @@ -140,6 +140,7 @@ class ElementControllerTest extends TestCase 'https://www.youtube.com/watch?v=yHx-r4p6hHU&t=1s', $body['element']['youtubeUrl'], ); + $this->assertNull($body['parentElement']); $this->assertSame([ [ 'id' => $firstChildElement->getId(), @@ -202,6 +203,11 @@ class ElementControllerTest extends TestCase $this->assertEquals(200, $response->getStatusCode()); $body = json_decode($response->getContent(), true); + $this->assertSame([ + 'id' => $parentElement->getId(), + 'title' => 'Baderech HaAvodah', + 'description' => 'A structured path for growth', + ], $body['parentElement']); $this->assertSame([ [ 'id' => $firstChildElement->getId(), diff --git a/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts b/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts index 8c52491..57a89ca 100644 --- a/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts +++ b/frontend/rabbi_gerzi/cypress/e2e/element-sibling-navigation.cy.ts @@ -10,6 +10,63 @@ function loginAsAdmin(): void { } describe('element sibling navigation', () => { + it('navigates public parent elements when one exists', () => { + cy.visit('/element/1') + cy.contains('h1', 'Baderech HaAvodah').should('be.visible') + cy.get('[data-cy="element-parent-link"]').should('not.exist') + + cy.visit('/element/2') + cy.contains('h1', '1. Introduction').should('be.visible') + cy.get('[data-cy="element-parent-link"]').as('parentLink') + cy.get('@parentLink') + .should('be.visible') + .and('contain.text', 'Parent: Baderech HaAvodah') + cy.get('@parentLink').should('have.attr', 'href', '/element/1') + cy.get('@parentLink').then((parentLinkElements) => { + cy.get('h1').then((headingElements) => { + expect( + parentLinkElements[0].compareDocumentPosition(headingElements[0]) + & Node.DOCUMENT_POSITION_FOLLOWING, + ).to.not.equal(0) + }) + }) + cy.get('@parentLink').click() + + cy.location('pathname').should('eq', '/element/1') + cy.contains('h1', 'Baderech HaAvodah').should('be.visible') + }) + + it('navigates admin parent elements when one exists', () => { + loginAsAdmin() + + cy.visit('/admin/element/1') + cy.get('[data-cy="admin-element-title"]') + .should('have.value', 'Baderech HaAvodah') + cy.get('[data-cy="admin-parent-link"]').should('not.exist') + + cy.visit('/admin/element/2') + cy.get('[data-cy="admin-element-title"]') + .should('have.value', '1. Introduction') + cy.get('[data-cy="admin-parent-link"]').as('parentLink') + cy.get('@parentLink') + .should('be.visible') + .and('contain.text', 'Parent: Baderech HaAvodah') + cy.get('@parentLink').should('have.attr', 'href', '/admin/element/1') + cy.get('@parentLink').then((parentLinkElements) => { + cy.get('.admin-element-page__heading').then((headingElements) => { + expect( + parentLinkElements[0].compareDocumentPosition(headingElements[0]) + & Node.DOCUMENT_POSITION_FOLLOWING, + ).to.not.equal(0) + }) + }) + cy.get('@parentLink').click() + + cy.location('pathname').should('eq', '/admin/element/1') + cy.get('[data-cy="admin-element-title"]') + .should('have.value', 'Baderech HaAvodah') + }) + it('navigates public same-parent elements with wraparound', () => { cy.visit('/element/1') cy.contains('h1', 'Baderech HaAvodah').should('be.visible')