Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BACKLOG-23432: Make SEO keywords field searchable #257

Merged
merged 5 commits into from
Jan 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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')
})
})
})
Loading