2020-07-20 14:13:59 +00:00
|
|
|
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() );
|
2020-07-20 14:13:59 +00:00
|
|
|
|
2024-04-18 18:37:58 +00:00
|
|
|
QUnit.test( '#getAuthorsBelow/#getThreadItemsBelow', ( assert ) => {
|
2024-05-24 12:20:50 +00:00
|
|
|
const cases = require( '../cases/authors.json' );
|
2020-07-20 14:13:59 +00:00
|
|
|
|
|
|
|
function newFromJSON( json ) {
|
2024-05-24 12:20:50 +00:00
|
|
|
let item;
|
2020-07-20 14:13:59 +00:00
|
|
|
if ( json.type === 'heading' ) {
|
|
|
|
item = new HeadingItem();
|
|
|
|
} else {
|
|
|
|
item = new CommentItem();
|
|
|
|
item.author = json.author;
|
2022-09-06 13:16:10 +00:00
|
|
|
item.displayName = json.displayName;
|
2020-07-20 14:13:59 +00:00
|
|
|
}
|
2022-02-21 00:22:39 +00:00
|
|
|
item.id = json.id;
|
2020-07-20 14:13:59 +00:00
|
|
|
item.replies = json.replies.map( newFromJSON );
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
2024-04-18 18:37:58 +00:00
|
|
|
cases.forEach( ( caseItem ) => {
|
2024-05-24 12:20:50 +00:00
|
|
|
const threadItem = newFromJSON( caseItem.thread ),
|
2020-07-20 14:13:59 +00:00
|
|
|
authors = threadItem.getAuthorsBelow();
|
|
|
|
|
|
|
|
assert.deepEqual(
|
|
|
|
authors,
|
2022-02-21 00:22:39 +00:00
|
|
|
caseItem.expectedAuthorsBelow,
|
|
|
|
'getAuthorsBelow'
|
|
|
|
);
|
|
|
|
|
|
|
|
assert.deepEqual(
|
2024-04-19 22:07:35 +00:00
|
|
|
threadItem.getThreadItemsBelow().map( ( item ) => item.id ),
|
2022-02-21 00:22:39 +00:00
|
|
|
caseItem.expectedThreadItemIdsBelow
|
2020-07-20 14:13:59 +00:00
|
|
|
);
|
|
|
|
} );
|
|
|
|
} );
|
2020-07-20 14:48:41 +00:00
|
|
|
|
2021-11-13 15:27:38 +00:00
|
|
|
// TODO:
|
|
|
|
// * getHeading (CommentItem+HeadingItem)
|
|
|
|
// * getLinkableTitle (HeadingItem)
|
|
|
|
// * newFromJSON (ThreadItem)
|