Wordpress/tests/qunit/wp-includes/js/wp-api.js
Adam Silverstein 399db7ac03 WP-API JS Client: Add helpers to get a model or collection by route.
Add two new helper functions, `wp.api.getModelByRoute` and `wp.api.getCollectionByRoute`. Passed a route, they return the matching model or collection, or `undefined` if none is found.

Also adds tests to verify these functions work as expected.

Props rcutmore.
Fixes #41111.


git-svn-id: https://develop.svn.wordpress.org/trunk@41334 602fd350-edb4-49c9-b593-d223f7449a82
2017-09-04 16:00:28 +00:00

347 lines
8.1 KiB
JavaScript

/* global wp */
( function( QUnit ) {
module( 'wpapi' );
QUnit.test( 'API Loaded correctly', function( assert ) {
var done = assert.async();
assert.expect( 2 );
assert.ok( wp.api.loadPromise );
wp.api.loadPromise.done( function() {
assert.ok( wp.api.models );
done();
} );
} );
// The list of collections we should check.
var collectionClassNames = [
'Categories',
'Comments',
'Media',
'Pages',
'Posts',
'Statuses',
'Tags',
'Taxonomies',
'Types',
'Users'
];
// Collections that should get helpers tested.
var collectionHelperTests = [
{
'collectionType': 'Posts',
'returnsModelType': 'post',
'supportsMethods': {
'getDate': 'getDate',
'getRevisions': 'getRevisions',
'getTags': 'getTags',
'getCategories': 'getCategories',
'getAuthorUser': 'getAuthorUser',
'getFeaturedMedia': 'getFeaturedMedia'
/*'getMeta': 'getMeta', currently not supported */
}
},
{
'collectionType': 'Pages',
'returnsModelType': 'page',
'supportsMethods': {
'getDate': 'getDate',
'getRevisions': 'getRevisions',
'getAuthorUser': 'getAuthorUser',
'getFeaturedMedia': 'getFeaturedMedia'
}
}
];
_.each( collectionClassNames, function( className ) {
QUnit.test( 'Testing ' + className + ' collection.', function( assert ) {
var done = assert.async();
wp.api.loadPromise.done( function() {
var theCollection = new wp.api.collections[ className ]();
assert.ok(
theCollection,
'We can instantiate wp.api.collections.' + className
);
theCollection.fetch().done( function() {
assert.equal(
1,
theCollection.state.currentPage,
'We should be on page 1 of the collection in ' + className
);
// Should this collection have helper methods?
var collectionHelperTest = _.findWhere( collectionHelperTests, { 'collectionType': className } );
// If we found a match, run the tests against it.
if ( ! _.isUndefined( collectionHelperTest ) ) {
// Test the first returned model.
var firstModel = theCollection.at( 0 );
// Is the model the right type?
assert.equal(
collectionHelperTest.returnsModelType,
firstModel.get( 'type' ),
'The wp.api.collections.' + className + ' is of type ' + collectionHelperTest.returnsModelType
);
// Does the model have all of the expected supported methods?
_.each( collectionHelperTest.supportsMethods, function( method ) {
assert.equal(
'function',
typeof firstModel[ method ],
className + '.' + method + ' is a function.'
);
} );
}
// Trigger Qunit async completion.
done();
} );
} );
} );
} );
// The list of models we should check.
var modelsWithIdsClassNames = [
'Category',
'Media',
'Page',
'Post',
'Tag',
'User',
'UsersMe',
'Settings'
];
_.each( modelsWithIdsClassNames, function( className ) {
QUnit.test( 'Checking ' + className + ' model.' , function( assert ) {
var done = assert.async();
assert.expect( 2 );
wp.api.loadPromise.done( function() {
var theModel = new wp.api.models[ className ]();
assert.ok( theModel, 'We can instantiate wp.api.models.' + className );
theModel.fetch().done( function( ) {
var theModel2 = new wp.api.models[ className ]();
theModel2.set( 'id', theModel.attributes.id );
theModel2.fetch().done( function() {
// We were able to retrieve the model.
assert.equal(
theModel.attributes.id,
theModel2.get( 'id' ) ,
'We should be able to get a ' + className
);
// Trigger Qunit async completion.
done();
} );
} );
} );
} );
} );
var modelsWithIndexes = [
'Taxonomy',
'Status',
'Type'
];
_.each( modelsWithIndexes, function( className ) {
QUnit.test( 'Testing ' + className + ' model.' , function( assert ) {
var done = assert.async();
assert.expect( 2 );
wp.api.loadPromise.done( function( ) {
var theModel = new wp.api.models[ className ]();
assert.ok( theModel, 'We can instantiate wp.api.models.' + className );
theModel.fetch().done( function( ) {
var theModel2 = new wp.api.models[ className ]();
if ( ! _.isUndefined( theModel.attributes[0] ) ) {
theModel2.set( 'id', theModel.attributes[0].id );
}
theModel2.fetch().done( function() {
// We were able to retrieve the model.
assert.notEqual(
0,
_.keys( theModel2.attributes ).length ,
'We should be able to get a ' + className
);
// Trigger Qunit async completion.
done();
} );
} );
} );
} );
} );
// Find models by route.
var modelsToFetchByRoute = [
'Category',
'Comment',
'Media',
'Page',
'PageRevision',
'Post',
'PostRevision',
'Status',
'Tag',
'Taxonomy',
'Type',
'User'
];
_.each( modelsToFetchByRoute, function( model ) {
QUnit.test( 'Test fetching ' + model + ' by route.', function( assert ) {
var done = assert.async();
assert.expect( 1 );
wp.api.loadPromise.done( function() {
var theModel = wp.api.models[ model ];
var route = theModel.prototype.route.index;
assert.equal(
wp.api.getModelByRoute( route ),
theModel,
'wp.api.models.' + model + ' found at route ' + route
);
// Trigger Qunit async completion.
done();
} );
} );
} );
// Find collections by route.
var collectionsToFetchByRoute = [
'Categories',
'Comments',
'Media',
'PageRevisions',
'Pages',
'PostRevisions',
'Posts',
'Statuses',
'Tags',
'Taxonomies',
'Types',
'Users'
];
_.each( collectionsToFetchByRoute, function( collection ) {
QUnit.test( 'Test fetching ' + collection + ' by route.', function( assert ) {
var done = assert.async();
assert.expect( 1 );
wp.api.loadPromise.done( function() {
var theCollection = wp.api.collections[ collection ];
var route = theCollection.prototype.route.index;
assert.equal(
wp.api.getCollectionByRoute( route ),
theCollection,
'wp.api.collections.' + collection + ' found at ' + route
);
// Trigger Qunit async completion.
done();
} );
} );
} );
// Test the jswidget custom namespace and endpoints.
wp.api.init( {
'versionString': 'js-widgets/v1/'
} ).done( function() {
var customClasses = [
'WidgetsArchives',
'WidgetsCalendar',
'WidgetsCategories',
'WidgetsMeta',
'WidgetsNav_menu',
'WidgetsPages',
'WidgetsPostCollection',
'WidgetsRecentComments',
'WidgetsRecentPosts',
'WidgetsRss',
'WidgetsSearch',
'WidgetsTag_cloud',
'WidgetsText'
];
// Check that we have and can get each model type.
_.each( customClasses, function( className ) {
QUnit.test( 'Checking ' + className + ' class name.' , function( assert ) {
var done = assert.async();
assert.expect( 2 );
wp.api.loadPromise.done( function() {
var theModel = new wp.api.models[ className ]();
assert.ok( theModel, 'We can instantiate wp.api.models.' + className );
var theCollection = new wp.api.collections[ className ]();
assert.ok( theCollection, 'We can instantiate wp.api.collections.' + className );
// Trigger Qunit async completion.
done();
} );
} );
} );
} );
// Check connecting to a second URL.
wp.api.loadPromise.done( function() {
QUnit.test( 'Checking connecting to a remote url.' , function( assert ) {
var done = assert.async();
wp.api.init({
'apiRoot': 'http://remotehost/wp-json/'
} ).done( function(){
var lastEndpoint = wp.api.endpoints.last(),
models = lastEndpoint.get( 'models' ),
post = new models.Post();
assert.equal( 'http://remotehost/wp-json/wp/v2/posts', post.url(), 'The remote API objects should have their own URLs' );
wp.api.init({
'apiRoot': 'http://localhost/wp-json/'
} ).done( function(){
var lastEndpoint = wp.api.endpoints.first(),
models = lastEndpoint.get( 'models' ),
post = new models.Post();
assert.equal( 'http://localhost/wp-json/wp/v2/posts', post.url(), 'The local API objects should have their own URLs' );
done();
} );
} );
} );
});
} )( window.QUnit );