Ghost/test/unit/frontend/helpers/reading_time.test.js
Hannah Wolfe 95d27e7f58
Moved frontend unit tests into their own folder
- this is a small part of a bit of cleanup of our test files
- the goal is to make the existing tests clearer with a view to making it easier to write more tests
- this makes the test structure follow the codebase structure more closely
- eventually we will colocate the frontend tests with the frontend code
2021-10-06 11:58:29 +01:00

118 lines
5.5 KiB
JavaScript

const should = require('should');
// Stuff we are testing
const reading_time = require('../../../../core/frontend/helpers/reading_time');
const almostOneMinute =
'<p>Ghost has a number of different user roles for your team</p>' +
'<h3 id="authors">Authors</h3><p>The base user level in Ghost is an author. Authors can write posts,' +
' edit their own posts, and publish their own posts. Authors are <strong>trusted</strong> users. If you ' +
'don\'t trust users to be allowed to publish their own posts, you shouldn\'t invite them to Ghost admin.</p>' +
'<h3 id="editors">Editors</h3><p>Editors are the 2nd user level in Ghost. Editors can do everything that an' +
' Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new' +
' authors to the site.</p><h3 id="administrators">Administrators</h3><p>The top user level in Ghost is Administrator.' +
' Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings ' +
'and data, not just content. Additionally, administrators have full access to invite, manage or remove any other' +
' user of the site.</p><h3 id="theowner">The Owner</h3><p>There is only ever one owner of a Ghost site. ' +
'The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: ' +
'The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings ' +
'if applicable — for example, billing details, if using Ghost(Pro).</p><hr><p>It\'s a good idea to ask all of your' +
' users to fill out their user profiles, including bio and social links. These will populate rich structured data ' +
'for posts and generally create more opportunities for themes to fully populate their design.</p>';
const almostOneAndAHalfMinute = almostOneMinute +
'<div>' +
'<p>Ghost has a number of different user roles for your team</p>' +
'<h3 id="authors">Authors</h3><p>The base user level in Ghost is an author. Authors can write posts,' +
' edit their own posts, and publish their own posts. Authors are <strong>trusted</strong> users. If you ' +
'don\'t trust users to be allowed to publish their own posts, you shouldn\'t invite them to Ghost admin.</p>' +
'<h3 id="editors">Editors</h3><p>Editors are the 2nd user level in Ghost. Editors can do everything that an' +
' Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new' +
' authors to the site.</p><h3 id="administrators">Administrators</h3><p>The top user level in Ghost is Administrator.' +
' Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings ' +
'and data, not just content. Additionally, administrators have full access to invite</p>' +
'</div>';
describe('{{reading_time}} helper', function () {
it('[success] renders reading time for less than one minute text as one minute', function () {
const data = {
html: almostOneMinute,
title: 'Test',
slug: 'slug'
};
const result = reading_time.call(data);
String(result).should.equal('1 min read');
});
it('[success] renders reading time for one minute text as one minute', function () {
const data = {
html: almostOneMinute +
'This needed about twenty-five more words before passing the one minute reading time, ' +
'since the word count was 250, and the average speed is 275.',
title: 'Test',
slug: 'slug'
};
const result = reading_time.call(data);
String(result).should.equal('1 min read');
});
it('[success] renders reading time for just under 1.5 minutes text as one minute', function () {
const data = {
html: almostOneAndAHalfMinute,
title: 'Test',
slug: 'slug'
};
const result = reading_time.call(data);
String(result).should.equal('1 min read');
});
it('[success] adds time for feature image', function () {
const data = {
html: almostOneAndAHalfMinute,
title: 'Test',
slug: 'slug',
feature_image: '/content/images/someimage.jpg'
};
const result = reading_time.call(data);
// The reading time for this HTML snippet would 89 seconds without the image
// Adding the 12 additional seconds for the image results in a readng time of over 1.5 minutes, rounded to 2
String(result).should.equal('2 min read');
});
it('[success] adds time for inline images', function () {
const data = {
html: almostOneAndAHalfMinute +
'<img src="test.png">',
title: 'Test',
slug: 'slug'
};
const result = reading_time.call(data);
// The reading time for this HTML snippet would 89 seconds without the image
// Adding the 12 additional seconds for the image results in a readng time of over 1.5 minutes, rounded to 2
String(result).should.equal('2 min read');
});
it('[failure] does not render reading time when not post', function () {
const data = {
author: {
name: 'abc 123',
slug: 'abc123'
}
};
const result = reading_time.call(data);
should.not.exist(result);
});
});