mediawiki-extensions-Discus.../tests/qunit/ThreadItem.test.js

45 lines
1.1 KiB
JavaScript
Raw Normal View History

var
CommentItem = require( 'ext.discussionTools.init' ).CommentItem,
HeadingItem = require( 'ext.discussionTools.init' ).HeadingItem;
Change CommentParser into a service Goal: ----- To have a method like CommentParser::parse(), which just takes a node to parse and a title and returns plain data, so that we don't need to keep track of the config to construct a CommentParser object (the required config like content language is provided by services) and we don't need to keep that object around after parsing. Changes: -------- CommentParser.php: * …is now a service. Constructor only takes services as arguments. The node and title are passed to a new parse() method. * parse() should return plain data, but I split this part to a separate patch for ease of review: I49bfe019aa460651447fd383f73eafa9d7180a92. * CommentParser still cheats and accesses global state in a few places, e.g. calling Title::makeTitleSafe or CommentUtils::getTitleFromUrl, so we can't turn its tests into true unit tests. This work is left for future commits. LanguageData.php: * …is now a service, instead of a static class. Parser.js: * …is not a real service, but it's changed to behave in a similar way. Constructor takes only the required config as argument, and node and title are instead passed to a new parse() method. CommentParserTest.php: parser.test.js: * Can be simplified, now that we don't need a useless node and title to test internal methods that don't use them. testUtils.js: * Can be simplified, now that we don't need to override internal ResourceLoader stuff just to change the parser config. Change-Id: Iadb7757debe000025e52770ca51ebcf24ca8ee66
2022-02-19 02:43:21 +00:00
QUnit.module( 'mw.dt.ThreadItem', QUnit.newMwEnvironment() );
QUnit.test( '#getAuthorsBelow/#getThreadItemsBelow', ( assert ) => {
const cases = require( '../cases/authors.json' );
function newFromJSON( json ) {
let item;
if ( json.type === 'heading' ) {
item = new HeadingItem();
} else {
item = new CommentItem();
item.author = json.author;
item.displayName = json.displayName;
}
item.id = json.id;
item.replies = json.replies.map( newFromJSON );
return item;
}
cases.forEach( ( caseItem ) => {
const threadItem = newFromJSON( caseItem.thread ),
authors = threadItem.getAuthorsBelow();
assert.deepEqual(
authors,
caseItem.expectedAuthorsBelow,
'getAuthorsBelow'
);
assert.deepEqual(
threadItem.getThreadItemsBelow().map( ( item ) => item.id ),
caseItem.expectedThreadItemIdsBelow
);
} );
} );
// TODO:
// * getHeading (CommentItem+HeadingItem)
// * getLinkableTitle (HeadingItem)
// * newFromJSON (ThreadItem)