Sequelize fixtures
This is a simple lib to load data to database using sequelize.
It is intended for easily setting up test data.
Yaml and json formats are supported. Includes a grunt task.
findOrCreate is used to create records, so no record duplication when identical fixtures are defined or loaded multiple times.
Install
npm install sequelize-fixtures
Test
npm test
Usage
var sequelize_fixtures = require('sequelize-fixtures'),
models = {
Foo: require('./models/Foo')
};
sequelize_fixtures.loadFile('fixtures/test_data.json', models, function(){
doStuffAfterLoad();
});
sequelize_fixtures.loadFile('fixtures/*.json', models, function(){
doStuffAfterLoad();
});
sequelize_fixtures.loadFiles(['fixtures/users.json', 'fixtures/data*.json'], models, function(){
doStuffAfterLoad();
};
sequelize_fixtures.loadFile('fixtures/*.json', models, { encoding: 'windows-1257'}, function(){
doStuffAfterLoad();
});
sequelize_fixtures.loadFile('ixtures/*.json', models, {
transformFixtureDataFn: function (data) {
if(data.createdAt
&& data.createdAt < 0) {
data.createdAt = new Date((new Date()).getTime() + parseFloat(data.createdAt) * 1000 * 60);
}
return data;
}
});
var fixtures = [
{
model: 'Foo',
data: {
propA: 'bar',
propB: 1
}
},
{
model: 'Foo',
data: {
propA: 'baz',
propB: 3
}
}
];
sequelize_fixtures.loadFixtures(fixtures, models, function(err){
doStuffAfterLoad();
});
File formats
json
[
{
"model": "Foo",
"data": {
"propA": "bar",
"propB": 1
}
},
{
"model": "Foo",
"data": {
"propA": "baz",
"propB": 3
}
}
]
yaml
fixtures:
- model: Foo
data:
propA: bar
propB: 1
- model: Foo
data:
propA: baz
propB: 3
javascript
module.exports = [
{
"model": "Foo",
"data": {
"propA": "bar",
"propB": 1
}
},
{
"model": "Foo",
"data": {
"propA": "baz",
"propB": 3
}
}
];
Associations
You can specify associations by providing related object id or a where clause to select associated object with. Make sure associated objects are described before associations!
belongsTo
Assuming Car.belongsTo(Owner)
:
[
{
"model": "Owner",
"data": {
"id": 11,
"name": "John Doe",
"city": "Vilnius"
}
},
{
"model": "Car",
"data": {
"id": 203,
"make": "Ford",
"owner": 11
}
}
]
OR
[
{
"model": "Owner",
"data": {
"name": "John Doe",
"city": "Vilnius"
}
},
{
"model": "Car",
"data": {
"make": "Ford",
"owner": {
"name": "John Doe"
}
}
}
]
hasMany
Assuming
Project.hasMany(m.Person);
Person.hasMany(m.Project);
[
{
"model":"Person",
"data":{
"id":122,
"name": "Jack",
"role": "Developer"
}
},
{
"model":"Person",
"data":{
"id": 123,
"name": "John",
"role": "Analyst"
}
},
{
"model":"Project",
"data": {
"id": 20,
"name": "The Great Project",
"peopleprojects": [122, 123]
}
}
]
OR
[
{
"model":"Person",
"data":{
"name": "Jack",
"role": "Developer"
}
},
{
"model":"Person",
"data":{
"name": "John",
"role": "Analyst"
}
},
{
"model":"Project",
"data": {
"name": "The Great Project",
"peopleprojects": [
{
"name": "Jack"
},
{
"name": "John"
}
]
}
}
]
Build options, save optons
For each model you can provide build options that are passed to Model.build() and save options that are passed to instance.save(), example:
{
"model": "Article",
"buildOptions": {
"raw": true,
"isNewRecord": true
},
"saveOptions": {
"fields": ["title", "body"]
},
"data": {
"title": "Any title",
"slug": "My Invalid Slug"
}
}
grunt task
Gruntfile.js:
grunt.initConfig({
fixtures: {
import_test_data: {
src: ['fixtures/data1.json', 'fixtures/models*.json'],
models: function () {
return require('../models')
},
options: {
encoding: 'windows-1257'
}
}
}
});
grunt.loadNpmTasks('sequelize-fixtures');