Skip to content

Commit

Permalink
BACKLOG-23432: Make SEO keywords field searchable (#257)
Browse files Browse the repository at this point in the history
* BACKLOG-23432: Make seo keywords searchable; add search test

* Refactor SEO keywords test suite

* Stablize tests

* Move check for SEO section to jcontent
  • Loading branch information
gflores-jahia authored Jan 13, 2025
1 parent b07547f commit cab0bf3
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 73 deletions.
2 changes: 1 addition & 1 deletion src/main/resources/META-INF/definitions.cnd
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@

[jmix:seoHtmlHead] mixin
extends = jnt:page, jmix:mainResource
- seoKeywords (string, tag[autocomplete=10,separator=',']) i18n facetable nofulltext multiple < '.{0,255}'
- seoKeywords (string, tag[autocomplete=10,separator=',']) i18n facetable multiple < '.{0,255}'
- openGraphImage (weakreference, picker[type='image']) < 'jmix:image'
92 changes: 92 additions & 0 deletions tests/cypress/e2e/fields/seoKeywords.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { addNode, createSite, deleteSite, getNodeByPath } from '@jahia/cypress'
import { JContent } from '@jahia/jcontent-cypress/dist/page-object/jcontent'
import { Field } from '@jahia/jcontent-cypress/dist/page-object/fields/field'

describe('SEO keywords tests', () => {
const siteKey = 'seoKeywordsTest'
const pageName_addTest = 'pagetest_addTag'
const pageName_removeTest = 'pagetest_removeTag'
const searchTag = { en: 'test1en', fr: 'test1fr' }

const createPageWithSEOKeyword = (pageName: string) => {
return addNode({
parentPathOrId: `/sites/${siteKey}/home`,
name: pageName,
primaryNodeType: 'jnt:page',
mixins: ['jmix:seoHtmlHead'],
properties: [
{ name: 'j:templateName', value: 'simple' },
{ name: 'jcr:title', language: 'en', value: pageName },
{ name: 'jcr:title', language: 'fr', value: pageName },
{ name: 'seoKeywords', language: 'en', values: [searchTag.en, 'test2en'] },
{ name: 'seoKeywords', language: 'fr', values: [searchTag.fr, 'test2fr'] },
],
})
}

before(function () {
createSite(siteKey, { templateSet: 'dx-base-demo-templates', serverName: 'localhost', locale: 'en,fr' })
createPageWithSEOKeyword(pageName_addTest)
createPageWithSEOKeyword(pageName_removeTest)
})

after(function () {
deleteSite(siteKey)
cy.logout()
})

beforeEach(function () {
cy.loginAndStoreSession()
})

it('should be possible to edit SEO fields : adding a new value', function () {
const ce = JContent.visit(siteKey, 'en', `pages/home/${pageName_addTest}`).editPage()

ce.openSection('seo')

const tagField = ce.getField(Field, 'htmlHead_seoKeywords')
tagField.get().find('#htmlHead_seoKeywords').click()
tagField.get().find('#htmlHead_seoKeywords').type('newtag{enter}', { delay: 500 })
tagField
.should('exist')
.and('be.visible')
.and('contain', 'test1en')
.and('contain', 'test2en')
.and('contain', 'newtag')
ce.save()

getNodeByPath(`/sites/${siteKey}/home/${pageName_addTest}`, ['seoKeywords']).then(({ data }) => {
expect(data.jcr.nodeByPath.properties.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values.length).to.eq(3)
expect(data.jcr.nodeByPath.properties[0].values).to.contains('newtag')
})
})

it('should be possible to edit SEO fields : removing a value', function () {
const ce = JContent.visit(siteKey, 'en', `pages/home/${pageName_removeTest}`).editPage()

ce.openSection('seo')

const tagField = ce.getField(Field, 'htmlHead_seoKeywords')
tagField.get().find('#htmlHead_seoKeywords').find('span:contains("test2en")').siblings('svg').click()
tagField.should('exist').and('be.visible').and('contain', 'test2en')
ce.save()

getNodeByPath(`/sites/${siteKey}/home/${pageName_removeTest}`, ['seoKeywords']).then(({ data }) => {
expect(data.jcr.nodeByPath.properties.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values[0]).to.eq('test1en')
})
})

it('should be able to search for seo keywords tag', function () {
const searchTagInLang = (lang) => {
cy.log(`Search for ${searchTag[lang]} in ${lang} site`)
cy.visit(`cms/render/default/${lang}/sites/${siteKey}/home/search-results.html`)
cy.get('.search-block input[type="text"]').type(`${searchTag[lang]}{enter}`)
cy.get('.s-results').contains(searchTag[lang], { timeout: 10000 }).should('be.visible')
}
searchTagInLang('en')
searchTagInLang('fr')
})
})
75 changes: 3 additions & 72 deletions tests/cypress/e2e/seoOverrides/definitions.cy.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,12 @@
import { addNode, createSite, deleteSite, getNodeByPath } from '@jahia/cypress'
import { createSite, deleteSite, getNodeByPath } from '@jahia/cypress'
import { JContent } from '@jahia/jcontent-cypress/dist/page-object/jcontent'
import { Field } from '@jahia/jcontent-cypress/dist/page-object/fields/field'

describe('New SEO field definition tests', () => {
const siteKey = 'seoFieldsTest'
const pageName_addTest = 'pagetest_addTag'
const pageName_removeTest = 'pagetest_removeTag'

const createPageWithSEOKeyword = (pageName: string) => {
return addNode({
parentPathOrId: `/sites/${siteKey}/home`,
name: pageName,
primaryNodeType: 'jnt:page',
mixins: ['jmix:seoHtmlHead'],
properties: [
{
name: 'j:templateName',
value: 'simple',
},
{
name: 'jcr:title',
value: pageName,
language: 'en',
},
{
name: 'seoKeywords',
values: ['test2en', 'test1en'],
language: 'en',
},
],
children: [],
})
}

before(function () {
createSite(siteKey)
createPageWithSEOKeyword(pageName_addTest)
createPageWithSEOKeyword(pageName_removeTest)
})

after(function () {
Expand All @@ -58,6 +28,7 @@ describe('New SEO field definition tests', () => {

ce.getField(Field, 'htmlHead_jcr:description').get().find('textarea').type('description test')
const tagField = ce.getField(Field, 'htmlHead_seoKeywords')
tagField.get().find('#htmlHead_seoKeywords').click()
tagField.get().find('#htmlHead_seoKeywords').type('tag{enter}', { delay: 500 })
tagField.get().find('#htmlHead_seoKeywords [role="button"]').contains('tag').should('be.visible')

Expand All @@ -77,9 +48,8 @@ describe('New SEO field definition tests', () => {
})
})

it('should not have SEO section and new SEO fields for other types', function () {
it('should not have new SEO fields for other types', function () {
JContent.visit(siteKey, 'en', 'content-folders/contents').createContent('Rich text')
cy.get(`[data-sel-content-editor-fields-group="seo"]`).should('not.exist', { timeout: 10000 })

const assertFieldNotExist = (contentType) => {
cy.get(`[data-sel-content-editor-field="${contentType}"]`).should('not.exist', { timeout: 10000 })
Expand All @@ -88,43 +58,4 @@ describe('New SEO field definition tests', () => {
assertFieldNotExist('htmlHead_seoKeywords')
assertFieldNotExist('htmlHead_openGraphImage')
})

it('should be possible to edit SEO fields : adding a new value', function () {
const ce = JContent.visit(siteKey, 'en', 'pages/home/' + pageName_addTest).editPage()

ce.openSection('seo')

const tagField = ce.getField(Field, 'htmlHead_seoKeywords')
tagField.get().find('#htmlHead_seoKeywords').type('newtag{enter}', { delay: 500 })
tagField
.should('exist')
.and('be.visible')
.and('contain', 'test1en')
.and('contain', 'test2en')
.and('contain', 'newtag')
ce.save()

getNodeByPath(`/sites/${siteKey}/home/${pageName_addTest}`, ['seoKeywords']).then(({ data }) => {
expect(data.jcr.nodeByPath.properties.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values.length).to.eq(3)
expect(data.jcr.nodeByPath.properties[0].values).to.contains('newtag')
})
})

it('should be possible to edit SEO fields : removing a value', function () {
const ce = JContent.visit(siteKey, 'en', 'pages/home/' + pageName_removeTest).editPage()

ce.openSection('seo')

const tagField = ce.getField(Field, 'htmlHead_seoKeywords')
tagField.get().find('#htmlHead_seoKeywords').find('span:contains("test1en")').siblings('svg').click()
tagField.should('exist').and('be.visible').and('contain', 'test2en')
ce.save()

getNodeByPath(`/sites/${siteKey}/home/${pageName_removeTest}`, ['seoKeywords']).then(({ data }) => {
expect(data.jcr.nodeByPath.properties.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values.length).to.eq(1)
expect(data.jcr.nodeByPath.properties[0].values[0]).to.eq('test2en')
})
})
})

0 comments on commit cab0bf3

Please sign in to comment.