yoastseo-dep
Version:
Yoast clientside page analysis
238 lines (206 loc) • 12.6 kB
JavaScript
import KeyphraseDistributionAssessment from "../../../../src/scoring/assessments/seo/KeyphraseDistributionAssessment.js";
import keyphraseDistribution from "../../../../src/languageProcessing/researches/keyphraseDistribution";
import EnglishResearcher from "../../../../src/languageProcessing/languages/en/Researcher";
import Paper from "../../../../src/values/Paper.js";
import Factory from "../../../specHelpers/factory.js";
import Mark from "../../../../src/values/Mark.js";
const keyphraseDistributionAssessment = new KeyphraseDistributionAssessment();
describe( "An assessment to check the keyphrase distribution in the text", function() {
it( "returns a 'consideration' score when no keyword occurs", function() {
const mockPaper = new Paper( "a string", { keyword: "keyword" } );
const assessment = keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher( {
keyphraseDistributionScore: 100,
sentencesToHighlight: [],
} )
);
expect( assessment.getScore() ).toEqual( 0 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/33q' target='_blank'>Keyphrase distribution</a>: " +
"<a href='https://yoa.st/33u' target='_blank'>Include your keyphrase or its synonyms in the text so that we can check keyphrase" +
" distribution</a>." );
} );
it( "returns a bad score when the % of sentences between topic occurrences is above 50%", function() {
const mockPaper = new Paper( "string with the keyword and the keyword", { keyword: "keyword" } );
const assessment = keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher( {
keyphraseDistributionScore: 60,
sentencesToHighlight: [],
} )
);
expect( assessment.getScore() ).toEqual( 1 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/33q' target='_blank'>Keyphrase distribution</a>: Very uneven. " +
"Large parts of your text do not contain the keyphrase or its synonyms. <a href='https://yoa.st/33u' target='_blank'>Distribute" +
" them more evenly</a>." );
} );
it( "returns an okay score when the % of sentences between topic occurrences is between recommended acceptable and good score", function() {
const mockPaper = new Paper( "string with the keyword and the keyword", { keyword: "keyword" } );
const assessment = keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher( {
keyphraseDistributionScore: 40,
sentencesToHighlight: [],
} )
);
expect( assessment.getScore() ).toEqual( 6 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/33q' target='_blank'>Keyphrase distribution</a>: Uneven. " +
"Some parts of your text do not contain the keyphrase or its synonyms. <a href='https://yoa.st/33u' target='_blank'>Distribute" +
" them more evenly</a>." );
} );
it( "returns a good score score when the % of sentences between topic occurrences is lower than the recommended good score", function() {
const mockPaper = new Paper( "string with the keyword and the keyword", { keyword: "keyword" } );
const assessment = keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher( {
keyphraseDistributionScore: 25,
sentencesToHighlight: [],
} )
);
expect( assessment.getScore() ).toEqual( 9 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/33q' target='_blank'>Keyphrase distribution</a>: Good job!" );
} );
} );
describe( "Checks if the assessment is applicable", function() {
let researcher;
beforeEach( () => {
researcher = new EnglishResearcher();
researcher.addResearch( "keyphraseDistribution", keyphraseDistribution );
} );
it( "is applicable to papers with more than 10 sentences when a keyword is set", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse. Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse.", { keyword: "keyword" } );
researcher.setPaper( mockPaper );
const isAssessmentApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( isAssessmentApplicable ).toBe( true );
} );
it( "is not applicable to papers with more than 10 sentences when no keyword is set", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse. Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse." );
researcher.setPaper( mockPaper );
const isAssessmentApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( isAssessmentApplicable ).toBe( false );
} );
it( "is not applicable to papers with less than 15 sentences", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet.", { keyword: "keyword" } );
researcher.setPaper( mockPaper );
const isAssessmentApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( isAssessmentApplicable ).toBe( false );
} );
it( "is not applicable to papers with more than 15 sentences when the sentences are inside an element that should" +
"be excluded from the analysis", function() {
const mockPaper = new Paper( "<blockquote>" + "Lorem ipsum dolor sit amet. ".repeat( 16 ) + "</blockquote>",
{ keyword: "keyword" } );
researcher.setPaper( mockPaper );
const isAssessmentApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( isAssessmentApplicable ).toBe( false );
} );
it( "is not applicable when the researcher doesn't have the research", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse. Lorem ipsum dolor sit amet, vim illum aeque" +
" constituam at. Id latine tritani alterum pro. Ei quod stet affert sed. Usu putent fabellas suavitate id." +
" Quo ut stet recusabo torquatos. Eum ridens possim expetenda te. Ex per putant comprehensam. At vel utinam" +
" cotidieque, at erat brute eum, velit percipit ius et. Has vidit accusata deterruisset ea, quod facete te" +
" vis. Vix ei duis dolor, id eum sonet fabulas. Id vix imperdiet efficiantur. Percipit probatus pertinax te" +
" sit. Putant intellegebat eu sit. Vix reque tation prompta id, ea quo labore viderer definiebas." +
" Oratio vocibus offendit an mei, est esse pericula liberavisse.", { keyword: "keyword" } );
researcher.setPaper( mockPaper );
delete researcher.customResearches.keyphraseDistribution;
const assessmentIsApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( assessmentIsApplicable ).toBe( false );
} );
it( "should not be applicable to a text consisting only of shortcodes", function() {
const shortcodeSentence = "[shortcode]".repeat( 15 ) + ". ";
const mockPaper = new Paper( shortcodeSentence.repeat( 15 ), { shortcodes: [ "shortcode" ] } );
researcher.setPaper( mockPaper );
const assessmentIsApplicable = keyphraseDistributionAssessment.isApplicable( mockPaper, researcher );
expect( assessmentIsApplicable ).toBe( false );
} );
} );
describe( "A test for marking keywords in the text", function() {
it( "returns markers for sentences specified by the researcher", function() {
const mockPaper = new Paper( "A sentence. A sentence containing keywords. Another sentence.", { keyword: "keyword" } );
keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher(
{
keyphraseDistributionScore: 5,
sentencesToHighlight: [
new Mark( {
original: "A sentence.",
marked: "<yoastmark class='yoast-text-mark'>A sentence.</yoastmark>",
} ),
new Mark( {
original: "Another sentence.",
marked: "<yoastmark class='yoast-text-mark'>Another sentence.</yoastmark>",
} ),
],
} )
);
const expected = [
new Mark( {
original: "A sentence.",
marked: "<yoastmark class='yoast-text-mark'>A sentence.</yoastmark>",
} ),
new Mark( {
original: "Another sentence.",
marked: "<yoastmark class='yoast-text-mark'>Another sentence.</yoastmark>",
} ),
];
expect( keyphraseDistributionAssessment.getMarks() ).toEqual( expected );
} );
it( "returns markers for a keyphrase found in image caption", function() {
const paper = new Paper( "<p><img class='size-medium wp-image-33' src='http://basic.wordpress.test/wp-content/uploads/2021/08/" +
"cat-3957861_1280-211x300.jpeg' alt='a different cat with toy' width='211' height='300'></img> " +
"A flamboyant cat with a toy<br></br>\n" +
"</p>",
{ keyword: "cat toy" } );
const researcher = new EnglishResearcher( paper );
researcher.addResearch( "keyphraseDistribution", keyphraseDistribution );
keyphraseDistributionAssessment.getResult( paper, researcher );
const expected = [
new Mark( {
marked: "A flamboyant <yoastmark class='yoast-text-mark'>cat</yoastmark> with a <yoastmark class='yoast-text-mark'>toy</yoastmark>",
original: "A flamboyant cat with a toy" } ) ];
expect( keyphraseDistributionAssessment.getMarks() ).toEqual( expected );
} );
it( "doesn't return markers if the research doesn't have sentences to highlight", function() {
const mockPaper = new Paper( "A sentence. Another sentence.", { keyword: "keyword" } );
keyphraseDistributionAssessment.getResult(
mockPaper,
Factory.buildMockResearcher(
{
keyphraseDistributionScore: 5,
sentencesToHighlight: [],
} )
);
expect( keyphraseDistributionAssessment.getMarks() ).toEqual( [] );
} );
} );