From da7ae98d5c2fe2280f17e08974da65af1050fe83 Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Wed, 6 Jul 2022 23:52:55 -0500 Subject: [PATCH] Enable Video Structured Data on benchmark pages --- helpers/config-node.js | 21 +++++++++++++++++---- helpers/listing-page.js | 12 ++++++++++++ test/listings/index.js | 16 +++++++++++++--- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/helpers/config-node.js b/helpers/config-node.js index 3d0b05a..6f87148 100644 --- a/helpers/config-node.js +++ b/helpers/config-node.js @@ -3,6 +3,7 @@ import fs from 'fs-extra' import pkg from '~/package.json' import { getSiteUrl } from '~/helpers/url.js' +import { getRouteType } from '~/helpers/app-derived.js' export const siteUrl = getSiteUrl() @@ -232,6 +233,10 @@ export class PageHead { return this.pageUrl.toString() } + get routeType () { + return getRouteType( this.pathname ) + } + get defaultMeta () { return nuxtHead.meta } @@ -310,14 +315,22 @@ export class PageHead { ].join('') } + get structuredDataMarkup () { - // console.log( 'this.structuredData', this.structuredData ) + // console.log( 'this.routeType', this.routeType, this.pathname ) - if ( this.structuredData === null ) return '' + const hasStructuredData = this.structuredData !== null + // Route is primarily for video + const videoRouteType = [ 'tv', 'benchmarks' ].includes( this.routeType ) - const structuredDataJson = JSON.stringify( this.structuredData ) + if ( hasStructuredData && videoRouteType ) { + const structuredDataJson = JSON.stringify( this.structuredData ) - return `` + return `` + } + + + return '' } get allHeadMarkup () { diff --git a/helpers/listing-page.js b/helpers/listing-page.js index 30f5935..16baf07 100644 --- a/helpers/listing-page.js +++ b/helpers/listing-page.js @@ -183,10 +183,22 @@ export class ListingDetails { } get structuredData () { + // Normal video page with app links if ( this.type === 'video' ) { return buildVideoStructuredData( this.api, this.api.appLinks ) } + // Benchmark page + if ( this.hasInitialVideo ) { + // Build app links with just the current app + const appLinks = [ { + name: this.api.name, + endpoint: this.api.endpoint + } ] + + return buildVideoStructuredData( this.initialVideo, appLinks ) + } + return null } diff --git a/test/listings/index.js b/test/listings/index.js index 942fff6..9b7cdb3 100644 --- a/test/listings/index.js +++ b/test/listings/index.js @@ -40,7 +40,7 @@ const listingsCases = { endpoint: '/app/expressvpn/benchmarks/', apiEndpointPath: '/api/app/expressvpn.json', expectInitialVideo: true, - shouldHaveVideoStucturedData: false + shouldHaveVideoStucturedData: true }, // Express VPN Benchmarks @@ -193,11 +193,21 @@ test( 'Listings with videos have structured data', async t => { for ( const [ caseEndpoint, listingCase ] of listingCaseEntries ) { const listingDetails = listingsDetails[ caseEndpoint ] + const listingPageHead = new PageHead( { + ...listingDetails.headOptions, + pathname: caseEndpoint + }) // Stop here if we're not expecting Video Structured Data - if ( !listingCase.shouldHaveVideoStucturedData ) continue + if ( !listingCase.shouldHaveVideoStucturedData ) { + + // Check that the non-video listing doesn't have video structured data + t.assert( !listingPageHead.structuredDataMarkup.includes('VideoObject'), `${ caseEndpoint } has video structured data` ) + + continue + } + - const listingPageHead = new PageHead( listingDetails.headOptions ) // t.log('listingDetails.initialVideo', listingDetails.initialVideo) // t.log( 'caseEndpoint', caseEndpoint )