UNPKG

yoastseo-dep

Version:

Yoast clientside page analysis

385 lines (321 loc) 15 kB
import { forEach } from "lodash-es"; import ContentAssessor from "../../../src/scoring/storePostsAndPages/contentAssessor.js"; import AssessmentResult from "../../../src/values/AssessmentResult.js"; import Paper from "../../../src/values/Paper.js"; import EnglishResearcher from "../../../src/languageProcessing/languages/en/Researcher"; import DutchResearcher from "../../../src/languageProcessing/languages/nl/Researcher"; import DefaultResearcher from "../../../src/languageProcessing/languages/_default/Researcher"; import WordComplexityAssessment from "../../../src/scoring/assessments/readability/WordComplexityAssessment"; import wordComplexity from "../../../src/languageProcessing/researches/wordComplexity"; import getWordComplexityConfig from "../../specHelpers/getWordComplexityConfig"; import getWordComplexityHelper from "../../specHelpers/getWordComplexityHelper"; describe( "A content assessor for English", function() { let results, contentAssessor, researcher, paper; beforeAll( function() { paper = new Paper(); researcher = new EnglishResearcher( paper ); // Also register the assessment, research, helper, and config for Word Complexity for testing purposes. researcher.addResearch( "wordComplexity", wordComplexity ); researcher.addHelper( "checkIfWordIsComplex", getWordComplexityHelper( "en" ) ); researcher.addConfig( "wordComplexity", getWordComplexityConfig( "en" ) ); contentAssessor = new ContentAssessor( researcher ); contentAssessor.addAssessment( "wordComplexity", new WordComplexityAssessment( { urlTitle: "https://yoa.st/shopify77", urlCallToAction: "https://yoa.st/shopify78", } ) ); contentAssessor.getValidResults = function() { return results; }; contentAssessor.getPaper = function() { return paper; }; } ); describe( "calculatePenaltyPoints", function() { it( "should have no points for an empty result set", function() { results = []; const expected = 0; const actual = contentAssessor.calculatePenaltyPoints(); expect( actual ).toBe( expected ); } ); it( "should return 0 for all green assessment results", function() { results = [ new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 9 } ), ]; const expected = 0; const actual = contentAssessor.calculatePenaltyPoints(); expect( actual ).toBe( expected ); } ); it( "should return 3 for a red assessment result", function() { contentAssessor._allAssessmentsSupported = function() { return true; }; results = [ new AssessmentResult( { score: 3 } ), ]; const expected = 3; const actual = contentAssessor.calculatePenaltyPoints(); expect( actual ).toBe( expected ); } ); it( "should return 2 for an orange assessment result", function() { results = [ new AssessmentResult( { score: 6 } ), ]; const expected = 2; const actual = contentAssessor.calculatePenaltyPoints(); expect( actual ).toBe( expected ); } ); it( "should return an aggregate for a mixed resultset", function() { contentAssessor._allAssessmentsSupported = function() { return true; }; results = [ new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 6 } ), new AssessmentResult( { score: 3 } ), new AssessmentResult( { score: 9 } ), new AssessmentResult( { score: 6 } ), new AssessmentResult( { score: 3 } ), new AssessmentResult( { score: 6 } ), new AssessmentResult( { score: 9 } ), new AssessmentResult( { text: "A piece of feedback" } ), ]; const expected = 6 + 6; const actual = contentAssessor.calculatePenaltyPoints(); expect( actual ).toBe( expected ); } ); } ); describe( "calculateOverallScore for English", function() { let points; beforeEach( function() { contentAssessor.calculatePenaltyPoints = function() { return points; }; } ); it( "should default to a bad indicator", function() { const expected = 30; results = []; const actual = contentAssessor.calculateOverallScore(); expect( actual ).toBe( expected ); } ); it( "should give worse results based on the negative points", function() { results = [ new AssessmentResult(), new AssessmentResult(), ]; const testCases = [ { points: 7, expected: 30 }, { points: 6, expected: 60 }, { points: 9, expected: 30 }, { points: 4, expected: 90 }, { points: 2, expected: 90 }, { points: 1.9, expected: 90 }, { points: 1, expected: 90 }, ]; forEach( testCases, function( testCase ) { points = testCase.points; contentAssessor._allAssessmentsSupported = function() { return true; }; const actual = contentAssessor.calculateOverallScore(); expect( actual ).toBe( testCase.expected ); } ); } ); } ); describe( "Checks the applicable assessments", function() { it( "Should have 8 available assessments for a fully supported language. " + "This doesn't include Word complexity assessment since the registration is done from Shopify side.", function() { paper = new Paper( "Lorem ipsum dolor sit amet, voluptua probatus ullamcorper id vis, ceteros consetetur qui ea, " + "nam movet populo aliquam te. His eu debitis fastidii. Pri ea amet dicant. Ut his suas corpora, eu reformidans " + "signiferumque duo. At erant expetenda patrioque quo, rebum atqui nam ad, tempor elaboraret interpretaris pri ad. " + "Novum postea sea in. Placerat recteque cu usu. Cu nam sadipscing disputationi, sed labitur elaboraret et. Eu sed " + "accumsan prodesset. Posse integre et nec, usu assum audiam erroribus eu. Ei viris eirmod interesset usu, " + "usu homero liberavisse in, solet disputando ea vim. Mei eu inani nonumes consulatu, ea alterum menandri ius, " + "ne euismod neglegentur sed. Vis te deleniti suscipit, fabellas laboramus pri ei. Te quo aliquip offendit. " + "Vero paulo regione ei eum, sed at atqui meliore copiosae. Has et vocent vivendum. Mundi graeco latine cum ne, " + "no cum laoreet alienum. Quo cu vero utinam constituto. Vis omnium vivendum ea. Eum lorem ludus possim ut. Eu has eius " + "munere explicari, atqui ullamcorper eos no, harum epicuri per ut. Utamur volumus minimum ea vel, duo eu praesent " + "accommodare. Mutat gloriatur ex cum, rebum salutandi ei his, vis delenit quaestio ne. Iisque qualisque duo ei. " + "Splendide tincidunt te sit, commune oporteat quo id. Sumo recusabo suscipiantur duo an, no eum malis vulputate " + "consectetuer. Mel te noster invenire, nec ad vidisse constituto. Eos ut quod.", { locale: "en_US" } ); researcher.setPaper( paper ); contentAssessor.getPaper = function() { return paper; }; const assessments = contentAssessor.getApplicableAssessments(); const expected = 8; expect( assessments.length ).toBe( expected ); expect( assessments.map( ( { identifier } ) => identifier ) ).toEqual( [ "subheadingsTooLong", "textParagraphTooLong", "textSentenceLength", "textTransitionWords", "passiveVoice", "textPresence", "sentenceBeginnings", "wordComplexity", ] ); } ); } ); describe( "has configuration overrides", () => { test( "SubheadingsDistributionTooLong", () => { const assessment = contentAssessor.getAssessment( "subheadingsTooLong" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.shouldNotAppearInShortText ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify68' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify69' target='_blank'>" ); } ); test( "SentenceLengthAssessment", () => { const assessment = contentAssessor.getAssessment( "textSentenceLength" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify48' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify49' target='_blank'>" ); } ); test( "ParagraphTooLong", () => { const assessment = contentAssessor.getAssessment( "textParagraphTooLong" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify66' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify67' target='_blank'>" ); } ); test( "TransitionWords", () => { const assessment = contentAssessor.getAssessment( "textTransitionWords" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify44' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify45' target='_blank'>" ); } ); test( "PassiveVoice", () => { const assessment = contentAssessor.getAssessment( "passiveVoice" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify42' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify43' target='_blank'>" ); } ); test( "TextPresence", () => { const assessment = contentAssessor.getAssessment( "textPresence" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify56' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify57' target='_blank'>" ); } ); test( "SentenceBeginnings", () => { const assessment = contentAssessor.getAssessment( "sentenceBeginnings" ); expect( assessment ).toBeDefined(); expect( assessment._config ).toBeDefined(); expect( assessment._config.urlTitle ).toBe( "<a href='https://yoa.st/shopify5' target='_blank'>" ); expect( assessment._config.urlCallToAction ).toBe( "<a href='https://yoa.st/shopify65' target='_blank'>" ); } ); } ); } ); describe( "A test for content assessor for non-English", () => { describe( "calculateOverallScore for non English with a text containing more than 200 words", function() { let points, results, contentAssessor; const paper = new Paper( "Lorem ipsum dolor sit amet, voluptua probatus ullamcorper id vis, ceteros consetetur qui ea, " + "nam movet populo aliquam te. His eu debitis fastidii. Pri ea amet dicant. Ut his suas corpora, eu reformidans " + "signiferumque duo. At erant expetenda patrioque quo, rebum atqui nam ad, tempor elaboraret interpretaris pri ad. " + "Novum postea sea in. Placerat recteque cu usu. Cu nam sadipscing disputationi, sed labitur elaboraret et. Eu sed " + "accumsan prodesset. Posse integre et nec, usu assum audiam erroribus eu. Ei viris eirmod interesset usu, " + "usu homero liberavisse in, solet disputando ea vim. Mei eu inani nonumes consulatu, ea alterum menandri ius, " + "ne euismod neglegentur sed. Vis te deleniti suscipit, fabellas laboramus pri ei. Te quo aliquip offendit. " + "Vero paulo regione ei eum, sed at atqui meliore copiosae. Has et vocent vivendum. Mundi graeco latine cum ne, " + "no cum laoreet alienum. Quo cu vero utinam constituto. Vis omnium vivendum ea. Eum lorem ludus possim ut. Eu has eius " + "munere explicari, atqui ullamcorper eos no, harum epicuri per ut. Utamur volumus minimum ea vel, duo eu praesent " + "accommodare. Mutat gloriatur ex cum, rebum salutandi ei his, vis delenit quaestio ne. Iisque qualisque duo ei. " + "Splendide tincidunt te sit, commune oporteat quo id. Sumo recusabo suscipiantur duo an, no eum malis vulputate " + "consectetuer. Mel te noster invenire, nec ad vidisse constituto. Eos ut quod.", { locale: "nl_NL" } ); beforeEach( function() { contentAssessor = new ContentAssessor( new DutchResearcher( paper ) ); contentAssessor.addAssessment( "wordComplexity", new WordComplexityAssessment( { urlTitle: "https://yoa.st/shopify77", urlCallToAction: "https://yoa.st/shopify78", } ) ); contentAssessor.getValidResults = function() { return results; }; contentAssessor.calculatePenaltyPoints = function() { return points; }; contentAssessor.getPaper = function() { return paper; }; } ); it( "should give worse results based on the negative points", function() { results = [ new AssessmentResult(), new AssessmentResult(), ]; const testCases = [ { points: 6, expected: 30 }, { points: 4, expected: 60 }, { points: 3, expected: 60 }, { points: 2, expected: 90 }, ]; forEach( testCases, function( testCase ) { points = testCase.points; const actual = contentAssessor.calculateOverallScore(); expect( actual ).toBe( testCase.expected ); } ); } ); } ); describe( "calculateOverallScore for non English with an empty paper", function() { let points, results, contentAssessor; let paper = new Paper( "", { locale: "jv_ID" } ); beforeEach( function() { contentAssessor = new ContentAssessor( new DefaultResearcher( paper ) ); contentAssessor.addAssessment( "wordComplexity", new WordComplexityAssessment( { urlTitle: "https://yoa.st/shopify77", urlCallToAction: "https://yoa.st/shopify78", } ) ); contentAssessor.getValidResults = function() { return results; }; contentAssessor.calculatePenaltyPoints = function() { return points; }; contentAssessor.getPaper = function() { return paper; }; } ); it( "should give worse results based on the negative points", function() { results = [ new AssessmentResult(), new AssessmentResult(), ]; const testCases = [ { points: 6, expected: 30 }, { points: 4, expected: 60 }, { points: 3, expected: 60 }, { points: 2, expected: 90 }, ]; forEach( testCases, function( testCase ) { points = testCase.points; const actual = contentAssessor.calculateOverallScore(); expect( actual ).toBe( testCase.expected ); } ); } ); // A text of at least 50 characters. const longEnoughText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis. There is more"; paper = new Paper( longEnoughText, { locale: "xx_XX" } ); it( "Should have 4 available assessments for a basic supported language", function() { const assessments = contentAssessor.getApplicableAssessments(); const expected = 4; expect( assessments.length ).toBe( expected ); expect( assessments.map( ( { identifier } ) => identifier ) ).toEqual( [ "subheadingsTooLong", "textParagraphTooLong", "textSentenceLength", "textPresence", ] ); } ); } ); } );