sarala
Version:
Javascript library to communicate with RESTful API built following JSON API specification. inspired by Laravel’s Eloquent.
332 lines (257 loc) • 10.9 kB
JavaScript
import moxios from 'moxios'
import Post from './dummy/models/Post'
describe('query builder', () => {
beforeEach(() => {
moxios.install()
})
afterEach(() => {
moxios.uninstall()
})
test('all', (done) => {
const post = new Post()
post.all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('find', (done) => {
const post = new Post()
post.find(1)
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/1')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('with', (done) => {
const post = new Post()
post.with(['tags', 'author', 'comments.author']).find(1)
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/1?include=tags,author,comments.author')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('paginate', (done) => {
const post = new Post()
post.paginate(4, 2)
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?page[size]=4&page[number]=2')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
describe('sorting', () => {
test('orderBy', (done) => {
const post = new Post()
post.orderBy('published_at').all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?sort=published_at')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('orderByDesc', (done) => {
const post = new Post()
post.orderByDesc('published_at').all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?sort=-published_at')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('chain sort methods', (done) => {
const post = new Post()
post.orderBy('author.name').orderByDesc('published_at').all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?sort=author.name,-published_at')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('it throws error for invalid sort directions', () => {
const doDumb = () => {
const post = new Post()
post.orderBy('author.name', 'crap')
}
expect(doDumb).toThrow('Sarale: Invalid sort direction: "crap". Allowed only "asc" or "desc".')
})
})
describe('sparse fields', () => {
test('model fields as an array', (done) => {
const post = new Post()
post.select(['title', 'subtitle']).all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?fields[posts]=title,subtitle')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('relationships fields as an object', (done) => {
const post = new Post()
post.select({
posts: ['title', 'subtitle'],
tags: ['name']
}).all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?fields[posts]=title,subtitle&fields[tags]=name')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('it throws error for invalid fields', () => {
const doDumb = () => {
const post = new Post()
post.select('crap')
}
expect(doDumb).toThrow('Sarala: Invalid fields list.')
})
})
describe('filtering', () => {
test('filter', (done) => {
const post = new Post()
post.filter('archived').all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[archived]')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('where', (done) => {
const post = new Post()
post.where('published-before', '2018-01-01').all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[published-before]=2018-01-01')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('where group', (done) => {
const post = new Post()
post.where('published-before', '2018-01-01', 'unicorn')
.where('likes-above', 100, 'unicorn')
.all()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[unicorn][published-before]=2018-01-01&filter[unicorn][likes-above]=100')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('limit', (done) => {
const post = new Post()
post.limit(10).get()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[limit]=10')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('offset', (done) => {
const post = new Post()
post.offset(10).get()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[offset]=10')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('limit and offset', (done) => {
const post = new Post()
post.limit(10).offset(20).get()
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?filter[limit]=10&filter[offset]=20')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
})
test('chain filters with paginate', (done) => {
const post = new Post()
post.with(['tags', 'author', 'comments.author']).paginate(4, 1)
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?include=tags,author,comments.author&page[size]=4&page[number]=1')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
test('querying from same instance multiple time should not merge request url', (done) => {
const post = new Post()
post.with(['tags', 'author', 'comments.author']).paginate(4, 1)
post.with(['tags', 'author', 'comments.author']).paginate(4, 1)
moxios.wait(() => {
let request = moxios.requests.mostRecent()
expect(request.config.method).toEqual('get')
expect(request.config.url).toEqual('https://sarala-demo.app/api/posts/?include=tags,author,comments.author&page[size]=4&page[number]=1')
expect(request.config.headers).toEqual({
'Accept': 'application/vnd.api+json'
})
done()
})
})
})