Skip to content

Commit

Permalink
migration_test is mysql specific, added postgres migration test
Browse files Browse the repository at this point in the history
  • Loading branch information
josephjunker committed May 16, 2012
1 parent 8e312bf commit 97ddbe6
Showing 1 changed file with 132 additions and 0 deletions.
132 changes: 132 additions & 0 deletions test/postgres_migration_test.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
juggling = require('../index')
Schema = juggling.Schema
Text = Schema.Text

DBNAME = process.env.DBNAME || 'myapp_test'
DBUSER = process.env.DBUSER || 'root'
DBPASS = ''
DBENGINE = process.env.DBENGINE || 'postgres'

require('./spec_helper').init module.exports

schema = new Schema DBENGINE, database: '', username: DBUSER, password: DBPASS
schema.log = (q) -> console.log q

query = (sql, cb) ->
schema.adapter.query sql, cb

User = schema.define 'User',
email: { type: String, null: false, index: true }
name: String
bio: Text
password: String
birthDate: Date
pendingPeriod: Number
createdByAdmin: Boolean

withBlankDatabase = (cb) ->
db = schema.settings.database = DBNAME
query 'DROP DATABASE IF EXISTS ' + db, (err) ->
query 'CREATE DATABASE ' + db, cb

getColumnDescriptions = (model, cb)->
query "SELECT column_name, data_type, is_nullable, column_default FROM information_schema.COLUMNS WHERE table_name = '#{model}'", (err, res)->
if err
cb err
else
fields = {}
fields[entry.column_name] = entry for entry in res
cb err, fields

it 'should run migration', (test)->
withBlankDatabase (err)->
schema.automigrate ->
getColumnDescriptions 'User', (err, fields)->
test.deepEqual fields,
id:
column_name: 'id'
data_type: 'integer'
is_nullable: 'NO'
column_default: 'nextval(\'"User_id_seq"\'::regclass)'
email:
column_name: 'email'
data_type: 'character varying'
is_nullable: 'NO'
column_default: null
name:
column_name: 'name'
data_type: 'character varying'
is_nullable: 'YES'
column_default: null
bio:
column_name: 'bio'
data_type: 'text'
is_nullable: 'YES'
column_default: null
password:
column_name: 'password'
data_type: 'character varying'
is_nullable: 'YES'
column_default: null
birthDate:
column_name: 'birthDate'
data_type: 'timestamp without time zone'
is_nullable: 'YES'
column_default: null
pendingPeriod:
column_name: 'pendingPeriod'
data_type: 'integer'
is_nullable: 'YES'
column_default: null
createdByAdmin:
column_name: 'createdByAdmin'
data_type: 'boolean'
is_nullable: 'YES'
column_default: null
test.done()

it 'should autoupdate', (test) ->
getColumnDescriptions 'User', (err, fields)->

userExists = (cb) ->
query 'SELECT * FROM "User"', (err, res) ->
cb(not err and res[0].email == 'test@example.com')

User.create email: 'test@example.com', (err, user) ->
test.ok not err, "error occurred while creating User: #{err}"
userExists (yep) ->
test.ok yep, 'userExists returned false'
User.defineProperty 'email', type: String
User.defineProperty 'createdByAdmin', type: String
User.defineProperty 'newProperty', type: Number
User.defineProperty 'pendingPeriod', false
schema.autoupdate (err) ->
getColumnDescriptions 'User', (err, fields) ->
# email should now be nullable
test.equal fields.email.is_nullable, 'YES', "email's nullability did not change to nullable"
# change type of createdByAdmin
test.equal fields.createdByAdmin.data_type, 'character varying', "createdByAdmin's data type did not change"
# new column should be added
test.ok fields.newProperty, 'New column was not added'
if fields.newProperty
test.equal fields.newProperty.data_type, 'integer', 'New column type is not integer'
# pendingPeriod should be dropped
test.ok not fields.pendingPeriod, 'pendingPeriod was not dropped'

# user should still exist
userExists (yep) ->
test.ok yep, 'user does not still exist after update'
test.done()

it 'should check actuality of schema', (test) ->
# drop column
User.schema.isActual (err, ok) ->
test.ok ok, "User is not actual before schema is modified"
User.defineProperty 'email', false
User.schema.isActual (err, ok) ->
test.ok not ok, "User should not be actual after schema is modified"
test.done()

it 'should disconnect when done', (test)->
schema.disconnect()
test.done()

0 comments on commit 97ddbe6

Please sign in to comment.