yoastseo-dep
Version:
Yoast clientside page analysis
228 lines (202 loc) • 15.2 kB
JavaScript
import DefaultResearcher from "../../../../src/languageProcessing/languages/_default/Researcher";
import EnglishResearcher from "../../../../src/languageProcessing/languages/en/Researcher";
import JapaneseResearcher from "../../../../src/languageProcessing/languages/ja/Researcher";
import TransitionWordsAssessment from "../../../../src/scoring/assessments/readability/TransitionWordsAssessment.js";
import Paper from "../../../../src/values/Paper.js";
import Factory from "../../../specHelpers/factory.js";
import Mark from "../../../../src/values/Mark.js";
const shortTextJapanese = "熱".repeat( 399 );
const longTextJapanese = "熱".repeat( 400 );
describe( "An assessment for transition word percentage", function() {
it( "returns the score for 0% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 10,
transitionWordSentences: 0 } ) );
expect( assessment.getScore() ).toEqual( 3 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: " +
"None of the sentences contain transition words. <a href='https://yoa.st/35a' target='_blank'>Use some</a>." );
expect( assessment.hasMarks() ).toBe( false );
} );
it( "returns the score for a paper with text but no sentences (e.g. only images)", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 0,
transitionWordSentences: 0 } ) );
expect( assessment.getScore() ).toEqual( 3 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: " +
"None of the sentences contain transition words. <a href='https://yoa.st/35a' target='_blank'>Use some</a>." );
expect( assessment.hasMarks() ).toBe( false );
} );
it( "returns the score for 10.0% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 10,
transitionWordSentences: 1 } ) );
expect( assessment.getScore() ).toEqual( 3 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: " +
"Only 10% of the sentences contain transition words, which is not enough. <a href='https://yoa.st/35a' " +
"target='_blank'>Use more of them</a>." );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 20.0% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 5,
transitionWordSentences: 1 } ) );
expect( assessment.getScore() ).toEqual( 6 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: " +
"Only 20% of the sentences contain transition words, which is not enough. <a href='https://yoa.st/35a' " +
"target='_blank'>Use more of them</a>." );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 25.0% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 4,
transitionWordSentences: 1 } ) );
expect( assessment.getScore() ).toEqual( 6 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: " +
"Only 25% of the sentences contain transition words, which is not enough. <a href='https://yoa.st/35a' " +
"target='_blank'>Use more of them</a>." );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 35.0% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 20,
transitionWordSentences: 7 } ) );
expect( assessment.getScore() ).toEqual( 9 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: Well done!" );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 40% sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 10,
transitionWordSentences: 4 } ) );
expect( assessment.getScore() ).toEqual( 9 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: Well done!" );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 47% sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 100,
transitionWordSentences: 47 } ) );
expect( assessment.getScore() ).toEqual( 9 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: Well done!" );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "returns the score for 66.7% of the sentences with transition words", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().getResult( mockPaper, Factory.buildMockResearcher( { totalSentences: 3,
transitionWordSentences: 2 } ) );
expect( assessment.getScore() ).toEqual( 9 );
expect( assessment.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: Well done!" );
expect( assessment.hasMarks() ).toBe( true );
} );
it( "should match transition word 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> " +
"However, a cat with the toy looks happier. She is given raw food. Seniors don't like it.<br></br>\n" +
"</p>" );
const researcher = new EnglishResearcher( paper );
const result = new TransitionWordsAssessment().getResult( paper, researcher );
expect( result.getScore() ).toEqual( 9 );
expect( result.getText() ).toEqual( "<a href='https://yoa.st/34z' target='_blank'>Transition words</a>: Well done!" );
} );
it( "is not applicable for empty papers", function() {
const mockPaper = new Paper();
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new EnglishResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "is not applicable when the text is less than 200 words", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet, ne sed agam oblique alterum. Eos percipit singulis no. No scripta graecis cum. " +
"Ut vim eius porro labore. Id quem civibus sit. Sed no primis urbanitas, aperiri laboramus voluptatibus ei per. Esse consul possim " +
"duo eu, eu duo natum ferri libris. Tritani percipit interpretaris ne ius. Mel prima definitionem eu, partem labores vim at. " +
"Prompta vivendum usu te. Indoctum philosophia definitiones usu ad, cum quodsi alienum et. " );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new EnglishResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "is not applicable when the text is more than 200 words but the text is inside an element we want to exclude from the analysis", function() {
const mockPaper = new Paper( "<blockquote>Lorem ipsum dolor sit amet, ne sed agam oblique alterum. Eos percipit singulis no." +
" No scripta graecis cum. Ut vim eius porro labore. Id quem civibus sit. Sed no primis urbanitas, aperiri laboramus voluptatibus" +
" ei per. Esse consul possim duo eu, eu duo natum ferri libris. Tritani percipit interpretaris ne ius. Mel prima definitionem eu," +
" partem labores vim at. Prompta vivendum usu te. Indoctum philosophia definitiones usu ad, cum quodsi alienum et. " +
"Sumo civibus appareat est ea, in iriure euismod dolores mel. Mea scripta senserit maluisset ei." +
" Vel id mollis delicata constituam, laoreet scriptorem his cu, " +
"facilis accusam quaerendum nam in. Adversarium philosophia deterruisset duo at, augue postulant ut eos, usu ne iuvaret docendi. " +
"Iudicabit eloquentiam usu no. Vide volumus pri ne. Eos ignota timeam ponderum ei, an postea principes prodesset sit, " +
"purto blandit offendit pro an. Ei vim ludus veniam mnesarchum. Ne modus consul dolorem his, solum alienum eu nec. " +
"Mea legendos deserunt quaerendum te, fierent fabellas eu per. Ei sea accumsan fabellas signiferumque. Veri ludus aperiri his at, " +
"meis dicant impedit an qui. Est error offendit ex, at affert mediocrem interpretaris nam. Percipit persecuti et mel, persecuti " +
"inciderint signiferumque cu usu, an sit nemore nusquam. Brute iracundia sea ei, ad esse dictas aliquam est, prompta ceteros " +
"aliquando ne vix. Fabulas voluptua eu vel. Ceteros euripidis has cu. Pro ea esse ignota perfecto, ius noluisse liberavisse ei. " +
"Has possim mediocritatem in. Paulo alienum accusamus pro cu, magna labore sit ad. Sumo paulo sea in, cum te latine " +
"labores inciderint.</blockquote>" );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new EnglishResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "should not be applicable if the text has more than 200 words, but part of the words are shortcodes", function() {
const mockPaper = new Paper( "Text " + "text ".repeat( 198 ) + "[shortcode]".repeat( 2 ), { shortcodes: [ "shortcode" ] } );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new EnglishResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "is applicable when used with a supported researcher, e.g. the English researcher", function() {
const mockPaper = new Paper( "Lorem ipsum dolor sit amet, ne sed agam oblique alterum. Eos percipit singulis no. No scripta graecis cum. " +
"Ut vim eius porro labore. Id quem civibus sit. Sed no primis urbanitas, aperiri laboramus voluptatibus ei per. Esse consul possim " +
"duo eu, eu duo natum ferri libris. Tritani percipit interpretaris ne ius. Mel prima definitionem eu, partem labores vim at. " +
"Prompta vivendum usu te. Indoctum philosophia definitiones usu ad, cum quodsi alienum et. Sumo civibus appareat est ea, " +
"in iriure euismod dolores mel. Mea scripta senserit maluisset ei. Vel id mollis delicata constituam, laoreet scriptorem his cu, " +
"facilis accusam quaerendum nam in. Adversarium philosophia deterruisset duo at, augue postulant ut eos, usu ne iuvaret docendi. " +
"Iudicabit eloquentiam usu no. Vide volumus pri ne. Eos ignota timeam ponderum ei, an postea principes prodesset sit, " +
"purto blandit offendit pro an. Ei vim ludus veniam mnesarchum. Ne modus consul dolorem his, solum alienum eu nec. " +
"Mea legendos deserunt quaerendum te, fierent fabellas eu per. Ei sea accumsan fabellas signiferumque. Veri ludus aperiri his at, " +
"meis dicant impedit an qui. Est error offendit ex, at affert mediocrem interpretaris nam. Percipit persecuti et mel, persecuti " +
"inciderint signiferumque cu usu, an sit nemore nusquam. Brute iracundia sea ei, ad esse dictas aliquam est, prompta ceteros " +
"aliquando ne vix. Fabulas voluptua eu vel. Ceteros euripidis has cu. Pro ea esse ignota perfecto, ius noluisse liberavisse ei. " +
"Has possim mediocritatem in. Paulo alienum accusamus pro cu, magna labore sit ad. Sumo paulo sea in, cum te latine " +
"labores inciderint.", { locale: "en_US" } );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new EnglishResearcher( mockPaper ) );
expect( assessment ).toBe( true );
} );
it( "is not applicable when used with a non-supported researcher, e.g. the default researcher", function() {
const mockPaper = new Paper( "This is a string", { locale: "xx_YY" } );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new DefaultResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "is not applicable when the text is less than 400 characters in Japanese", function() {
const mockPaper = new Paper( shortTextJapanese );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new JapaneseResearcher( mockPaper ) );
expect( assessment ).toBe( false );
} );
it( "is applicable when the text is 400 characters or longer in Japanese", function() {
const mockPaper = new Paper( longTextJapanese );
const assessment = new TransitionWordsAssessment().isApplicable( mockPaper, new JapaneseResearcher( mockPaper ) );
expect( assessment ).toBe( true );
} );
} );
describe( "A test for marking sentences containing a transition word", function() {
it( "returns markers for sentences containing transition words", function() {
const paper = new Paper( "This sentence is marked, because it contains a transition word." );
const transitionWords = Factory.buildMockResearcher( { sentenceResults: [ { sentence: "This sentence is marked, " +
"because it contains a transition word.", transitionWords: [ "because" ] } ] } );
const expected = [
new Mark( { original: "This sentence is marked, because it contains a transition word.", marked: "<yoastmark " +
"class='yoast-text-mark'>This sentence is marked, because it contains a transition word.</yoastmark>" } ),
];
expect( new TransitionWordsAssessment().getMarks( paper, transitionWords ) ).toEqual( expected );
} );
it( "returns no markers if no sentences contain a transition word", function() {
const paper = new Paper( "This sentence is not marked." );
const transitionWords = Factory.buildMockResearcher( { sentenceResults: [ ] } );
const expected = [];
expect( new TransitionWordsAssessment().getMarks( paper, transitionWords ) ).toEqual( expected );
} );
it( "returns markers for an image caption containing transition words", 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> " +
"However, a cat with the toy looks happier. She is given raw food. Seniors don't like it.<br></br>\n" +
"</p>" );
const researcher = new EnglishResearcher( paper );
const expected = [
new Mark( {
original: "However, a cat with the toy looks happier.",
marked: "<yoastmark class='yoast-text-mark'>However, a cat with the toy looks happier.</yoastmark>" } ),
];
expect( new TransitionWordsAssessment().getMarks( paper, researcher ) ).toEqual( expected );
} );
} );