@sanity/migrate
Version:
Tooling for running data migrations on Sanity.io projects
388 lines (387 loc) • 9.42 kB
JavaScript
import { expect, test } from 'vitest';
import { at, create, createIfNotExists, createOrReplace, del, patch } from '../creators.js';
import { inc, insert, set, setIfMissing, unset } from '../operations/creators.js';
test('single patch mutation', function() {
expect(patch('cat', at([
'title'
], set('hello world')))).toStrictEqual({
id: 'cat',
patches: [
{
op: {
type: 'set',
value: 'hello world'
},
path: [
'title'
]
}
],
type: 'patch'
});
});
test('single create mutation', function() {
expect(create({
_id: 'cat',
_type: 'hello'
})).toStrictEqual({
document: {
_id: 'cat',
_type: 'hello'
},
type: 'create'
});
});
test('two patch mutations', function() {
expect(patch('cat', [
at([
'title'
], set('hello world')),
at([
'subtitle'
], set('nice to see you'))
])).toStrictEqual({
id: 'cat',
patches: [
{
op: {
type: 'set',
value: 'hello world'
},
path: [
'title'
]
},
{
op: {
type: 'set',
value: 'nice to see you'
},
path: [
'subtitle'
]
}
],
type: 'patch'
});
});
test('single patch with revision', function() {
expect(patch('cat', at([
'title'
], set('hello world')), {
ifRevision: 'rev0'
})).toStrictEqual({
id: 'cat',
options: {
ifRevision: 'rev0'
},
patches: [
{
op: {
type: 'set',
value: 'hello world'
},
path: [
'title'
]
}
],
type: 'patch'
});
});
test('multiple mutations', function() {
expect([
createOrReplace({
_id: 'foo',
_type: 'lol',
count: 1
}),
patch('foo', [
at('title', set('hello')),
at('count', inc(2))
], {
ifRevision: 'someRev'
})
]).toEqual([
{
document: {
_id: 'foo',
_type: 'lol',
count: 1
},
type: 'createOrReplace'
},
{
id: 'foo',
options: {
ifRevision: 'someRev'
},
patches: [
{
op: {
type: 'set',
value: 'hello'
},
path: [
'title'
]
},
{
op: {
amount: 2,
type: 'inc'
},
path: [
'count'
]
}
],
type: 'patch'
}
]);
});
test('multiple ops in a single patch mutation', function() {
expect([
createIfNotExists({
_id: 'foo',
_type: 'lol',
count: 1
}),
patch('foo', [
at('title', set('hello')),
at('count', inc(2))
], {
ifRevision: 'someRev'
})
]).toEqual([
{
document: {
_id: 'foo',
_type: 'lol',
count: 1
},
type: 'createIfNotExists'
},
{
id: 'foo',
options: {
ifRevision: 'someRev'
},
patches: [
{
op: {
type: 'set',
value: 'hello'
},
path: [
'title'
]
},
{
op: {
amount: 2,
type: 'inc'
},
path: [
'count'
]
}
],
type: 'patch'
}
]);
});
test('all permutations', function() {
var mutations = [
create({
_id: 'foo',
_type: 'foo',
count: 0
}),
createIfNotExists({
_id: 'bar',
_type: 'bar',
count: 1
}),
createOrReplace({
_id: 'baz',
_type: 'baz',
count: 2
}),
patch('qux', [
at('title', set('hello')),
at('items', setIfMissing([])),
at('items', insert([
1,
2,
3
], 'after', 1)),
at('title', unset()),
at('count', inc(2))
], {
ifRevision: 'someRev'
}),
patch('quux', [
at('title', set('hello')),
at('items', setIfMissing([])),
at('items', insert([
1,
2,
3
], 'after', 0)),
at('title', unset()),
at('count', inc(2))
]),
del('quuz'),
del('corge')
];
expect(mutations).toEqual([
{
document: {
_id: 'foo',
_type: 'foo',
count: 0
},
type: 'create'
},
{
document: {
_id: 'bar',
_type: 'bar',
count: 1
},
type: 'createIfNotExists'
},
{
document: {
_id: 'baz',
_type: 'baz',
count: 2
},
type: 'createOrReplace'
},
{
id: 'qux',
options: {
ifRevision: 'someRev'
},
patches: [
{
op: {
type: 'set',
value: 'hello'
},
path: [
'title'
]
},
{
op: {
type: 'setIfMissing',
value: []
},
path: [
'items'
]
},
{
op: {
items: [
1,
2,
3
],
position: 'after',
referenceItem: 1,
type: 'insert'
},
path: [
'items'
]
},
{
op: {
type: 'unset'
},
path: [
'title'
]
},
{
op: {
amount: 2,
type: 'inc'
},
path: [
'count'
]
}
],
type: 'patch'
},
{
id: 'quux',
patches: [
{
op: {
type: 'set',
value: 'hello'
},
path: [
'title'
]
},
{
op: {
type: 'setIfMissing',
value: []
},
path: [
'items'
]
},
{
op: {
items: [
1,
2,
3
],
position: 'after',
referenceItem: 0,
type: 'insert'
},
path: [
'items'
]
},
{
op: {
type: 'unset'
},
path: [
'title'
]
},
{
op: {
amount: 2,
type: 'inc'
},
path: [
'count'
]
}
],
type: 'patch'
},
{
id: 'quuz',
type: 'delete'
},
{
id: 'corge',
type: 'delete'
}
]);
});