diff --git a/core/server/data/schema/schema.js b/core/server/data/schema/schema.js index 22b9103af5e..aadc7d0f352 100644 --- a/core/server/data/schema/schema.js +++ b/core/server/data/schema/schema.js @@ -1,228 +1,228 @@ module.exports = { posts: { - id: {type: 'string', nullable: false, primary: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, uuid: {type: 'string', maxlength: 36, nullable: false, validations: {isUUID: true}}, - title: {type: 'string', maxlength: 150, nullable: false}, - slug: {type: 'string', maxlength: 150, nullable: false, unique: true}, - markdown: {type: 'text', maxlength: 16777215, fieldtype: 'medium', nullable: true}, + title: {type: 'string', maxlength: 2000, nullable: false}, + slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, + markdown: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, mobiledoc: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, - html: {type: 'text', maxlength: 16777215, fieldtype: 'medium', nullable: true}, - amp: {type: 'text', maxlength: 16777215, fieldtype: 'medium', nullable: true}, - image: {type: 'text', maxlength: 2000, nullable: true}, + html: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, + amp: {type: 'text', maxlength: 1000000000, fieldtype: 'long', nullable: true}, + image: {type: 'string', maxlength: 2000, nullable: true}, featured: {type: 'bool', nullable: false, defaultTo: false}, page: {type: 'bool', nullable: false, defaultTo: false}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'draft'}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'draft'}, language: {type: 'string', maxlength: 6, nullable: false, defaultTo: 'en_US'}, - visibility: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}}, - meta_title: {type: 'string', maxlength: 150, nullable: true}, - meta_description: {type: 'string', maxlength: 200, nullable: true}, - author_id: {type: 'string', nullable: false}, + visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}}, + meta_title: {type: 'string', maxlength: 2000, nullable: true}, + meta_description: {type: 'string', maxlength: 2000, nullable: true}, + author_id: {type: 'string', maxlength: 24, nullable: false}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true}, + updated_by: {type: 'string', maxlength: 24, nullable: true}, published_at: {type: 'dateTime', nullable: true}, - published_by: {type: 'string', nullable: true} + published_by: {type: 'string', maxlength: 24, nullable: true} }, users: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: false}, - slug: {type: 'string', maxlength: 150, nullable: false, unique: true}, - ghost_auth_access_token: {type: 'string', nullable: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 191, nullable: false}, + slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, + ghost_auth_access_token: {type: 'string', maxlength: 32, nullable: true}, password: {type: 'string', maxlength: 60, nullable: false}, email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, - image: {type: 'text', maxlength: 2000, nullable: true}, - cover: {type: 'text', maxlength: 2000, nullable: true}, - bio: {type: 'string', maxlength: 200, nullable: true}, - website: {type: 'text', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, + image: {type: 'string', maxlength: 2000, nullable: true}, + cover: {type: 'string', maxlength: 2000, nullable: true}, + bio: {type: 'text', maxlength: 65535, nullable: true}, + website: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, location: {type: 'text', maxlength: 65535, nullable: true}, - facebook: {type: 'text', maxlength: 2000, nullable: true}, - twitter: {type: 'text', maxlength: 2000, nullable: true}, + facebook: {type: 'string', maxlength: 2000, nullable: true}, + twitter: {type: 'string', maxlength: 2000, nullable: true}, accessibility: {type: 'text', maxlength: 65535, nullable: true}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'active'}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'active'}, language: {type: 'string', maxlength: 6, nullable: false, defaultTo: 'en_US'}, - visibility: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}}, - meta_title: {type: 'string', maxlength: 150, nullable: true}, - meta_description: {type: 'string', maxlength: 200, nullable: true}, + visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public']]}}, + meta_title: {type: 'string', maxlength: 2000, nullable: true}, + meta_description: {type: 'string', maxlength: 2000, nullable: true}, tour: {type: 'text', maxlength: 65535, nullable: true}, last_login: {type: 'dateTime', nullable: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, roles: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: false, unique: true}, - description: {type: 'string', maxlength: 200, nullable: true}, - created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, - updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 50, nullable: false, unique: true}, + description: {type: 'string', maxlength: 2000, nullable: true}, + created_at: {type: 'dateTime', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, + updated_at: {type: 'dateTime', nullable: true}, + updated_by: {type: 'string', maxlength: 24, nullable: true} }, roles_users: { - id: {type: 'string', nullable: false, primary: true}, - role_id: {type: 'string', nullable: false}, - user_id: {type: 'string', nullable: false} + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + role_id: {type: 'string', maxlength: 24, nullable: false}, + user_id: {type: 'string', maxlength: 24, nullable: false} }, permissions: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: false, unique: true}, - object_type: {type: 'string', maxlength: 150, nullable: false}, - action_type: {type: 'string', maxlength: 150, nullable: false}, - object_id: {type: 'string', nullable: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 50, nullable: false, unique: true}, + object_type: {type: 'string', maxlength: 50, nullable: false}, + action_type: {type: 'string', maxlength: 50, nullable: false}, + object_id: {type: 'string', maxlength: 24, nullable: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, permissions_users: { - id: {type: 'string', nullable: false, primary: true}, - user_id: {type: 'string', nullable: false}, - permission_id: {type: 'string', nullable: false} + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + user_id: {type: 'string', maxlength: 24, nullable: false}, + permission_id: {type: 'string', maxlength: 24, nullable: false} }, permissions_roles: { - id: {type: 'string', nullable: false, primary: true}, - role_id: {type: 'string', nullable: false}, - permission_id: {type: 'string', nullable: false} + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + role_id: {type: 'string', maxlength: 24, nullable: false}, + permission_id: {type: 'string', maxlength: 24, nullable: false} }, permissions_apps: { - id: {type: 'string', nullable: false, primary: true}, - app_id: {type: 'string', nullable: false}, - permission_id: {type: 'string', nullable: false} + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + app_id: {type: 'string', maxlength: 24, nullable: false}, + permission_id: {type: 'string', maxlength: 24, nullable: false} }, settings: { - id: {type: 'string', nullable: false, primary: true}, - key: {type: 'string', maxlength: 150, nullable: false, unique: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + key: {type: 'string', maxlength: 50, nullable: false, unique: true}, value: {type: 'text', maxlength: 65535, nullable: true}, - type: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'core', validations: {isIn: [['core', 'blog', 'theme', 'app', 'plugin', 'private']]}}, + type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'core', validations: {isIn: [['core', 'blog', 'theme', 'app', 'plugin', 'private']]}}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, tags: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: false, validations: {matches: /^([^,]|$)/}}, - slug: {type: 'string', maxlength: 150, nullable: false, unique: true}, - description: {type: 'string', maxlength: 200, nullable: true}, - image: {type: 'text', maxlength: 2000, nullable: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 191, nullable: false, validations: {matches: /^([^,]|$)/}}, + slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, + description: {type: 'text', maxlength: 65535, nullable: true}, + image: {type: 'string', maxlength: 2000, nullable: true}, parent_id: {type: 'string', nullable: true}, - visibility: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'public', validations: {isIn: [['public', 'internal']]}}, - meta_title: {type: 'string', maxlength: 150, nullable: true}, - meta_description: {type: 'string', maxlength: 200, nullable: true}, + visibility: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'public', validations: {isIn: [['public', 'internal']]}}, + meta_title: {type: 'string', maxlength: 2000, nullable: true}, + meta_description: {type: 'string', maxlength: 2000, nullable: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, posts_tags: { - id: {type: 'string', nullable: false, primary: true}, - post_id: {type: 'string', nullable: false, references: 'posts.id'}, - tag_id: {type: 'string', nullable: false, references: 'tags.id'}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + post_id: {type: 'string', maxlength: 24, nullable: false, references: 'posts.id'}, + tag_id: {type: 'string', maxlength: 24, nullable: false, references: 'tags.id'}, sort_order: {type: 'integer', nullable: false, unsigned: true, defaultTo: 0} }, apps: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: false, unique: true}, - slug: {type: 'string', maxlength: 150, nullable: false, unique: true}, - version: {type: 'string', maxlength: 150, nullable: false}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'inactive'}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 191, nullable: false, unique: true}, + slug: {type: 'string', maxlength: 191, nullable: false, unique: true}, + version: {type: 'string', maxlength: 50, nullable: false}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'inactive'}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, app_settings: { - id: {type: 'string', nullable: false, primary: true}, - key: {type: 'string', maxlength: 150, nullable: false, unique: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + key: {type: 'string', maxlength: 50, nullable: false, unique: true}, value: {type: 'text', maxlength: 65535, nullable: true}, - app_id: {type: 'string', nullable: false, references: 'apps.id'}, + app_id: {type: 'string', maxlength: 24, nullable: false, references: 'apps.id'}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, app_fields: { - id: {type: 'string', nullable: false, primary: true}, - key: {type: 'string', maxlength: 150, nullable: false}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + key: {type: 'string', maxlength: 50, nullable: false}, value: {type: 'text', maxlength: 65535, nullable: true}, - type: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'html'}, - app_id: {type: 'string', nullable: false, references: 'apps.id'}, - relatable_id: {type: 'string', nullable: false}, - relatable_type: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'posts'}, + type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'html'}, + app_id: {type: 'string', maxlength: 24, nullable: false, references: 'apps.id'}, + relatable_id: {type: 'string', maxlength: 24, nullable: false}, + relatable_type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'posts'}, active: {type: 'bool', nullable: false, defaultTo: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, clients: { - id: {type: 'string', nullable: false, primary: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, uuid: {type: 'string', maxlength: 36, nullable: false}, - name: {type: 'string', maxlength: 150, nullable: false, unique: true}, - slug: {type: 'string', maxlength: 150, nullable: false, unique: true}, - secret: {type: 'string', maxlength: 150, nullable: false}, + name: {type: 'string', maxlength: 50, nullable: false, unique: true}, + slug: {type: 'string', maxlength: 50, nullable: false, unique: true}, + secret: {type: 'string', maxlength: 191, nullable: false}, redirection_uri: {type: 'string', maxlength: 2000, nullable: true}, client_uri: {type: 'string', maxlength: 2000, nullable: true}, auth_uri: {type: 'string', maxlength: 2000, nullable: true}, logo: {type: 'string', maxlength: 2000, nullable: true}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'development'}, - type: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'ua', validations: {isIn: [['ua', 'web', 'native']]}}, - description: {type: 'string', maxlength: 200, nullable: true}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'development'}, + type: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'ua', validations: {isIn: [['ua', 'web', 'native']]}}, + description: {type: 'string', maxlength: 2000, nullable: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, client_trusted_domains: { - id: {type: 'string', nullable: false, primary: true}, - client_id: {type: 'string', nullable: false, references: 'clients.id'}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'}, trusted_domain: {type: 'string', maxlength: 2000, nullable: true} }, accesstokens: { - id: {type: 'string', nullable: false, primary: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, token: {type: 'string', maxlength: 191, nullable: false, unique: true}, - user_id: {type: 'string', nullable: false, references: 'users.id'}, - client_id: {type: 'string', nullable: false, references: 'clients.id'}, + user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'}, + client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'}, expires: {type: 'bigInteger', nullable: false} }, refreshtokens: { - id: {type: 'string', nullable: false, primary: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, token: {type: 'string', maxlength: 191, nullable: false, unique: true}, - user_id: {type: 'string', nullable: false, references: 'users.id'}, - client_id: {type: 'string', nullable: false, references: 'clients.id'}, + user_id: {type: 'string', maxlength: 24, nullable: false, references: 'users.id'}, + client_id: {type: 'string', maxlength: 24, nullable: false, references: 'clients.id'}, expires: {type: 'bigInteger', nullable: false} }, subscribers: { - id: {type: 'string', nullable: false, primary: true}, - name: {type: 'string', maxlength: 150, nullable: true}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + name: {type: 'string', maxlength: 191, nullable: true}, email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'pending', validations: {isIn: [['subscribed', 'pending', 'unsubscribed']]}}, - post_id: {type: 'string', nullable: true, references: 'posts.id'}, - subscribed_url: {type: 'text', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, - subscribed_referrer: {type: 'text', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, - unsubscribed_url: {type: 'text', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {isIn: [['subscribed', 'pending', 'unsubscribed']]}}, + post_id: {type: 'string', maxlength: 24, nullable: true}, + subscribed_url: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, + subscribed_referrer: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, + unsubscribed_url: {type: 'string', maxlength: 2000, nullable: true, validations: {isEmptyOrURL: true}}, unsubscribed_at: {type: 'dateTime', nullable: true}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, invites: { - id: {type: 'string', nullable: false, primary: true}, - role_id: {type: 'string', nullable: false}, - status: {type: 'string', maxlength: 150, nullable: false, defaultTo: 'pending', validations: {isIn: [['pending', 'sent']]}}, + id: {type: 'string', maxlength: 24, nullable: false, primary: true}, + role_id: {type: 'string', maxlength: 24, nullable: false}, + status: {type: 'string', maxlength: 50, nullable: false, defaultTo: 'pending', validations: {isIn: [['pending', 'sent']]}}, token: {type: 'string', maxlength: 191, nullable: false, unique: true}, email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, expires: {type: 'bigInteger', nullable: false}, created_at: {type: 'dateTime', nullable: false}, - created_by: {type: 'string', nullable: false}, + created_by: {type: 'string', maxlength: 24, nullable: false}, updated_at: {type: 'dateTime', nullable: true}, - updated_by: {type: 'string', nullable: true} + updated_by: {type: 'string', maxlength: 24, nullable: true} }, brute: { - key: {type: 'string'}, + key: {type: 'string', maxlength: 191}, firstRequest: {type: 'bigInteger'}, lastRequest: {type: 'bigInteger'}, lifetime: {type: 'bigInteger'}, diff --git a/core/test/integration/import_spec.js b/core/test/integration/import_spec.js index 385108ea4d9..5fc22fcea7f 100644 --- a/core/test/integration/import_spec.js +++ b/core/test/integration/import_spec.js @@ -220,47 +220,6 @@ describe('Import', function () { }).catch(done); }); - it('doesn\'t import invalid post data from 001', function (done) { - var exportData; - - testUtils.fixtures.loadExportFixture('export-001').then(function (exported) { - exportData = exported; - - // change title to 151 characters - exportData.data.posts[0].title = new Array(152).join('a'); - exportData.data.posts[0].tags = 'Tag'; - return importer.doImport(exportData); - }).then(function () { - (1).should.eql(0, 'Data import should not resolve promise.'); - }, function (error) { - error[0].message.should.eql('Value in [posts.title] exceeds maximum length of 150 characters.'); - error[0].errorType.should.eql('ValidationError'); - - Promise.all([ - knex('users').select(), - knex('posts').select(), - knex('tags').select() - ]).then(function (importedData) { - should.exist(importedData); - - importedData.length.should.equal(3, 'Did not get data successfully'); - - var users = importedData[0], - posts = importedData[1], - tags = importedData[2]; - - // we always have 1 user, the default user we added - users.length.should.equal(1, 'There should only be one user'); - - // Nothing should have been imported - posts.length.should.equal(0, 'Wrong number of posts'); - tags.length.should.equal(0, 'no new tags'); - - done(); - }); - }).catch(done); - }); - it('doesn\'t import invalid settings data from 001', function (done) { var exportData; @@ -368,46 +327,6 @@ describe('Import', function () { }).catch(done); }); - it('doesn\'t import invalid post data from 002', function (done) { - var exportData; - - testUtils.fixtures.loadExportFixture('export-002').then(function (exported) { - exportData = exported; - - // change title to 151 characters - exportData.data.posts[0].title = new Array(152).join('a'); - exportData.data.posts[0].tags = 'Tag'; - return importer.doImport(exportData); - }).then(function () { - (1).should.eql(0, 'Data import should not resolve promise.'); - }, function (error) { - error[0].message.should.eql('Value in [posts.title] exceeds maximum length of 150 characters.'); - error[0].errorType.should.eql('ValidationError'); - - Promise.all([ - knex('users').select(), - knex('posts').select(), - knex('tags').select() - ]).then(function (importedData) { - should.exist(importedData); - - importedData.length.should.equal(3, 'Did not get data successfully'); - - var users = importedData[0], - posts = importedData[1], - tags = importedData[2]; - - // we always have 1 user, the owner user we added - users.length.should.equal(1, 'There should only be one user'); - // Nothing should have been imported - posts.length.should.equal(0, 'Wrong number of posts'); - tags.length.should.equal(0, 'no new tags'); - - done(); - }); - }).catch(done); - }); - it('doesn\'t import invalid settings data from 002', function (done) { var exportData; @@ -607,6 +526,51 @@ describe('Import', function () { }).catch(done); }); }); + + describe('Validation', function () { + beforeEach(testUtils.setup('roles', 'owner', 'settings')); + + it('doesn\'t import a title which is too long', function (done) { + var exportData; + + testUtils.fixtures.loadExportFixture('export-001').then(function (exported) { + exportData = exported; + + // change title to 1001 characters + exportData.data.posts[0].title = new Array(2002).join('a'); + exportData.data.posts[0].tags = 'Tag'; + return importer.doImport(exportData); + }).then(function () { + (1).should.eql(0, 'Data import should not resolve promise.'); + }, function (error) { + error[0].message.should.eql('Value in [posts.title] exceeds maximum length of 2000 characters.'); + error[0].errorType.should.eql('ValidationError'); + + Promise.all([ + knex('users').select(), + knex('posts').select(), + knex('tags').select() + ]).then(function (importedData) { + should.exist(importedData); + + importedData.length.should.equal(3, 'Did not get data successfully'); + + var users = importedData[0], + posts = importedData[1], + tags = importedData[2]; + + // we always have 1 user, the default user we added + users.length.should.equal(1, 'There should only be one user'); + + // Nothing should have been imported + posts.length.should.equal(0, 'Wrong number of posts'); + tags.length.should.equal(0, 'no new tags'); + + done(); + }); + }).catch(done); + }); + }); }); // Tests in here do an import-per-describe, and then have several tests to check various bits of data diff --git a/core/test/unit/migration_spec.js b/core/test/unit/migration_spec.js index c467e129127..f978ed346c1 100644 --- a/core/test/unit/migration_spec.js +++ b/core/test/unit/migration_spec.js @@ -20,7 +20,7 @@ should.equal(true, true); // both of which are required for migrations to work properly. describe('DB version integrity', function () { // Only these variables should need updating - var currentSchemaHash = 'fa72ab0ca7ce8ee20bafb6e73b61a324', + var currentSchemaHash = 'e648a7d1f9b9c5eb19512999756cd4db', currentFixturesHash = 'b9e684a87353c592df9b23948e364c05'; // If this test is failing, then it is likely a change has been made that requires a DB version bump, diff --git a/core/test/utils/fixtures/data-generator.js b/core/test/utils/fixtures/data-generator.js index 30904e96605..d60ca91e236 100644 --- a/core/test/utils/fixtures/data-generator.js +++ b/core/test/utils/fixtures/data-generator.js @@ -529,12 +529,42 @@ DataGenerator.forKnex = (function () { // this is not pretty, but the fastest // it relies on the created posts/tags posts_tags = [ - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[0].id, tag_id: DataGenerator.Content.tags[0].id}, - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[0].id, tag_id: DataGenerator.Content.tags[1].id}, - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[1].id, tag_id: DataGenerator.Content.tags[0].id}, - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[1].id, tag_id: DataGenerator.Content.tags[1].id}, - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[2].id, tag_id: DataGenerator.Content.tags[2].id}, - {id: ObjectId.generate(), post_id: DataGenerator.Content.posts[3].id, tag_id: DataGenerator.Content.tags[3].id} + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[0].id, + tag_id: DataGenerator.Content.tags[0].id, + sort_order: 0 + }, + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[0].id, + tag_id: DataGenerator.Content.tags[1].id, + sort_order: 1 + }, + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[1].id, + tag_id: DataGenerator.Content.tags[0].id, + sort_order: 2 + }, + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[1].id, + tag_id: DataGenerator.Content.tags[1].id, + sort_order: 3 + }, + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[2].id, + tag_id: DataGenerator.Content.tags[2].id, + sort_order: 4 + }, + { + id: ObjectId.generate(), + post_id: DataGenerator.Content.posts[3].id, + tag_id: DataGenerator.Content.tags[3].id, + sort_order: 5 + } ]; apps = [