UNPKG

yoastseo-dep

Version:

Yoast clientside page analysis

340 lines (272 loc) 19.5 kB
/* eslint-disable capitalized-comments, spaced-comment */ import { merge } from "lodash-es"; import KeyphraseLengthAssessment from "../../../../src/scoring/assessments/seo/KeyphraseLengthAssessment"; import Paper from "../../../../src/values/Paper.js"; import CatalanResearcher from "../../../../src/languageProcessing/languages/ca/Researcher"; import GermanResearcher from "../../../../src/languageProcessing/languages/de/Researcher"; import deProductConfig from "../../../../src/languageProcessing/languages/de/config/keyphraseLength"; import EnglishResearcher from "../../../../src/languageProcessing/languages/en/Researcher"; import JapaneseResearcher from "../../../../src/languageProcessing/languages/ja/Researcher"; import { primeLanguageSpecificData } from "../../../../src/languageProcessing/helpers/morphology/buildTopicStems"; describe( "the keyphrase length assessment for product pages", function() { const productConfig = { parameters: { recommendedMinimum: 4, recommendedMaximum: 6, acceptableMaximum: 8, acceptableMinimum: 1, }, }; it( "should assess a product page without a keyword as extremely bad", function() { const paper = new Paper( "", { keyword: "" } ); const result = new KeyphraseLengthAssessment( productConfig ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( -999 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "No focus keyphrase was set for this page. " + "<a href='https://yoa.st/33j' target='_blank'>Set a keyphrase in order to calculate your SEO score</a>." ); expect( result.hasJumps() ).toBeTruthy(); expect( result.getEditFieldName() ).toBe( "keyphrase" ); } ); it( "should show a different feedback text for product pages when no keyphrase is set for a related keyphrase", function() { const paper = new Paper( "", { keyword: "" } ); const rkProductConfig = merge( productConfig, { isRelatedKeyphrase: true } ); const result = new KeyphraseLengthAssessment( rkProductConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( -999 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "<a href='https://yoa.st/33j' target='_blank'>Set a keyphrase in order to calculate your SEO score</a>." ); expect( result.hasJumps() ).toBeTruthy(); } ); it( "should assess a product page with one-word keyphrase as bad ", function() { const paper = new Paper( "", { keyword: "a test" } ); const result = new KeyphraseLengthAssessment( productConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 1 content word. That's way less than the recommended minimum of 4 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); expect( result.hasJumps() ).toBeTruthy(); } ); it( "should assess a product page with a keyphrase that's slightly too short as okay ", function() { const paper = new Paper( "", { keyword: "a test ".repeat( 3 ) } ); const result = new KeyphraseLengthAssessment( productConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 3 content words. That's less than the recommended minimum of 4 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); expect( result.hasJumps() ).toBeTruthy(); } ); it( "should assess a product page with a keyphrase that's the correct length", function() { const paper = new Paper( "", { keyword: "a test ".repeat( 4 ) } ); const result = new KeyphraseLengthAssessment( productConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); expect( result.hasJumps() ).toBeFalsy(); expect( result.hasEditFieldName() ).toBeFalsy(); } ); it( "should assess a product page with a keyphrase that's slightly too long as okay", function() { const paper = new Paper( "", { keyword: "a test ".repeat( 7 ) } ); const result = new KeyphraseLengthAssessment( productConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 7 content words. That's more than the recommended maximum of 6 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); expect( result.hasJumps() ).toBeTruthy(); } ); it( "should assess a product page with a keyphrase that's too long as bad", function() { const paper = new Paper( "", { keyword: "a test ".repeat( 9 ) } ); const result = new KeyphraseLengthAssessment( productConfig, true ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 9 content words. That's way more than the recommended maximum of 6 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); expect( result.hasJumps() ).toBeTruthy(); } ); } ); describe( "the keyphrase length assessment for languages with custom configuration", function() { it( "should clear the memoized data", function() { primeLanguageSpecificData.cache.clear(); const mockPaper = new Paper( "", { keyword: "ein Test" } ); const mockResearcher = new GermanResearcher( mockPaper ); expect( mockResearcher.getConfig( "functionWords" )[ 0 ] ).toEqual( "das" ); } ); it( "should assess a German product page with one-word keyphrase as bad ", function() { const paper = new Paper( "", { keyword: "ein Test" } ); const result = new KeyphraseLengthAssessment( deProductConfig, true ).getResult( paper, new GermanResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 1 content word. That's way less than the recommended minimum of 3 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); } ); it( "should assess a German product page with a slightly too short keyphrase as okay", function() { const paper = new Paper( "", { keyword: "ein Test ".repeat( 2 ) } ); const result = new KeyphraseLengthAssessment( deProductConfig, true ).getResult( paper, new GermanResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 2 content words. That's less than the recommended minimum of 3 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); } ); it( "should assess a German product page with a keyphrase that's the correct length", function() { const paper = new Paper( "", { keyword: "ein Test ".repeat( 3 ) } ); const result = new KeyphraseLengthAssessment( deProductConfig, true ).getResult( paper, new GermanResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); } ); it( "should assess a German product page with a keyphrase that's slightly too long as okay", function() { const paper = new Paper( "", { keyword: "ein Test ".repeat( 7 ) } ); const result = new KeyphraseLengthAssessment( deProductConfig, true ).getResult( paper, new GermanResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 7 content words. That's more than the recommended maximum of 6 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a German product page with a keyphrase that's too long as bad", function() { const paper = new Paper( "", { keyword: "ein Test ".repeat( 9 ) } ); const result = new KeyphraseLengthAssessment( deProductConfig, true ).getResult( paper, new GermanResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 9 content words. That's way more than the recommended maximum of 6 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); } ); describe( "the keyphrase length assessment for languages without function words", function() { it( "should clear the memoized data", function() { primeLanguageSpecificData.cache.clear(); const mockPaper = new Paper( "", { keyword: "test" } ); const mockResearcher = new CatalanResearcher( mockPaper ); expect( mockResearcher.getConfig( "functionWords" ) ).toEqual( [] ); } ); it( "should assess a paper with an 6-word keyphrase as good for a language that doesn't support function words", function() { const paper = new Paper( "", { keyword: "test ".repeat( 6 ) } ); const result = new KeyphraseLengthAssessment().getResult( paper, new CatalanResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); } ); it( "should assess a paper with an 9-word keyphrase as okay for a language that doesn't support function words", function() { const paper = new Paper( "", { keyword: "test ".repeat( 9 ) } ); const result = new KeyphraseLengthAssessment().getResult( paper, new CatalanResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 9 words. That's more than the recommended maximum of 6 words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); } ); describe( "the keyphrase length assessment for regular posts and pages", function() { it( "should clear the memoized data", function() { primeLanguageSpecificData.cache.clear(); const mockPaper = new Paper( "", { keyword: "a test" } ); const mockResearcher = new EnglishResearcher( mockPaper ); expect( mockResearcher.getConfig( "functionWords" )[ 0 ] ).toEqual( "the" ); } ); it( "should assess a paper without a keyword as extremely bad", function() { const paper = new Paper( "", { keyword: "" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( -999 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "No focus keyphrase was set for this page. " + "<a href='https://yoa.st/33j' target='_blank'>Set a keyphrase in order to calculate your SEO score</a>." ); } ); it( "should show a different feedback text when no keyphrase is set for a related keyphrase", function() { const paper = new Paper( "", { keyword: "" } ); const result = new KeyphraseLengthAssessment( { isRelatedKeyphrase: true } ).getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( -999 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "<a href='https://yoa.st/33j' target='_blank'>Set a keyphrase in order to calculate your SEO score</a>." ); } ); it( "should assess a paper with a keyphrase that's too long as bad", function() { const paper = new Paper( "", { keyword: "a test ".repeat( 11 ) } ); const result = new KeyphraseLengthAssessment().getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 11 content words. That's way more than the recommended maximum of 4 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a paper with a keyphrase that's the correct length", function() { const paper = new Paper( "", { keyword: "a test" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); } ); it( "should assess a paper with a keyphrase that's a little longer than the correct length", function() { const paper = new Paper( "", { keyword: "lost in the awkward space time continuum" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new EnglishResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 5 content words. That's more than the recommended maximum of 4 content words. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a paper with a keyphrase in quotation marks and return string with 'words' instead of 'content words'", function() { const paper = new Paper( "", { keyword: '"lost in the awkward space time continuum"' } ); const result = new KeyphraseLengthAssessment().getResult( paper, new EnglishResearcher( paper ) ); // This behaviour is incorrect: we expect the keyphrase to be considered too long, just like the above spec. // However, currently, all keyphrases enclosed in double quotes are counted as having length 1. expect( result.getScore() ).toEqual( 9 ); } ); } ); //Japanese tests do test character specific logic. So not removed. describe( "the keyphrase length assessment for Japanese", function() { it( "should clear the memoized data", function() { primeLanguageSpecificData.cache.clear(); const mockPaper = new Paper( "", { keyword: "猫" } ); const mockResearcher = new JapaneseResearcher( mockPaper ); expect( mockResearcher.getConfig( "functionWords" )[ 0 ] ).toEqual( "が" ); } ); it( "should assess a paper with a good length keyphrase in Japanese", function() { const paper = new Paper( "", { keyword: "猫" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); } ); it( "should assess a paper with a slightly too long keyphrase in Japanese", function() { const paper = new Paper( "", { keyword: "他の記事執筆者へ執筆の参考例を示すた" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 18 characters. That's more than the recommended maximum of 12 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a paper with a too long keyphrase in Japanese", function() { const paper = new Paper( "", { keyword: "他の記事執筆者へ執筆の参考例を示すために" } ); const result = new KeyphraseLengthAssessment().getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 20 characters. That's way more than the recommended maximum of 12 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a paper with a good length keyphrase for a product page in Japanese", function() { const paper = new Paper( "", { keyword: "犬と猫とハムスター" } ); const result = new KeyphraseLengthAssessment( {}, true ).getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 9 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: Good job!" ); } ); it( "should assess a paper with a slightly too short keyphrase for a product page in Japanese", function() { const paper = new Paper( "", { keyword: "モルモット" } ); const result = new KeyphraseLengthAssessment( {}, true ).getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 5 characters. That's less than the recommended minimum of 8 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); } ); it( "should assess a paper with a too short keyphrase for a product page in Japanese", function() { const paper = new Paper( "", { keyword: "猫" } ); const result = new KeyphraseLengthAssessment( {}, true ).getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 1 character. That's way less than the recommended minimum of 8 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it longer</a>!" ); } ); it( "should assess a paper with a slightly too long keyphrase for a product page in Japanese", function() { const paper = new Paper( "", { keyword: "他の記事執筆者へ執筆の参考例を示すた" } ); const result = new KeyphraseLengthAssessment( {}, true ).getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 6 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 18 characters. That's more than the recommended maximum of 12 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); it( "should assess a paper with a too long keyphrase in Japanese", function() { const paper = new Paper( "", { keyword: "他の記事執筆者へ執筆の参考例を示すために" } ); const result = new KeyphraseLengthAssessment( {}, true ).getResult( paper, new JapaneseResearcher( paper ) ); expect( result.getScore() ).toEqual( 3 ); expect( result.getText() ).toEqual( "<a href='https://yoa.st/33i' target='_blank'>Keyphrase length</a>: " + "The keyphrase contains 20 characters. That's way more than the recommended maximum of 12 characters. " + "<a href='https://yoa.st/33j' target='_blank'>Make it shorter</a>!" ); } ); } );