balena-supervisor/test/02-db.spec.coffee
Pablo Carranza Velez 652b596c80 Add some more unit tests to the multicontainer supervisor
We add a bunch of additional unit tests, and also a coverage report using istanbul.

The tests are not meant to cover everything, but they're a first attempt at having *some* unit testing
on the supervisor. There's much to improve but hopefully it helps catch obvious errors.

Change-Type: patch
Signed-off-by: Pablo Carranza Velez <pablo@resin.io>
2018-04-30 19:39:01 -07:00

84 lines
2.8 KiB
CoffeeScript

prepare = require './lib/prepare'
Promise = require 'bluebird'
m = require 'mochainon'
{ expect } = m.chai
fs = Promise.promisifyAll(require('fs'))
Knex = require('knex')
DB = require('../src/db')
createOldDatabase = (path) ->
knex = new Knex(
client: 'sqlite3'
connection:
filename: path
useNullAsDefault: true
)
createEmptyTable = (name, fn) ->
knex.schema.createTable name, (t) ->
fn(t) if fn?
createEmptyTable 'app', (t) ->
t.increments('id').primary()
t.boolean('privileged')
t.string('containerId')
.then ->
createEmptyTable 'config', (t) ->
t.string('key')
t.string('value')
.then ->
createEmptyTable 'dependentApp', (t) ->
t.increments('id').primary()
.then ->
createEmptyTable 'dependentDevice', (t) ->
t.increments('id').primary()
.then ->
return knex
describe 'DB', ->
before ->
prepare()
@db = new DB()
it 'initializes correctly, running the migrations', ->
expect(@db.init()).to.be.fulfilled
it 'creates a database at the path from an env var', ->
promise = fs.statAsync(process.env.DATABASE_PATH)
expect(promise).to.be.fulfilled
it 'creates a database at the path passed on creation', ->
db2 = new DB({ databasePath: process.env.DATABASE_PATH_2 })
promise = db2.init().then( -> fs.statAsync(process.env.DATABASE_PATH_2))
expect(promise).to.be.fulfilled
it 'adds new fields and removes old ones in an old database', ->
databasePath = process.env.DATABASE_PATH_3
createOldDatabase(databasePath)
.then (knexForDB) ->
db = new DB({ databasePath })
db.init()
.then ->
Promise.all([
expect(knexForDB.schema.hasColumn('app', 'appId')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('app', 'releaseId')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('app', 'config')).to.eventually.be.false
expect(knexForDB.schema.hasColumn('app', 'privileged')).to.eventually.be.false
expect(knexForDB.schema.hasColumn('app', 'containerId')).to.eventually.be.false
expect(knexForDB.schema.hasColumn('dependentApp', 'environment')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('dependentDevice', 'markedForDeletion')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('dependentDevice', 'localId')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('dependentDevice', 'is_managed_by')).to.eventually.be.true
expect(knexForDB.schema.hasColumn('dependentDevice', 'lock_expiry_date')).to.eventually.be.true
])
it 'creates a deviceConfig table with a single default value', ->
promise = @db.models('deviceConfig').select()
Promise.all([
expect(promise).to.eventually.have.lengthOf(1)
expect(promise).to.eventually.deep.equal([ { targetValues: '{}' } ])
])
it 'allows performing transactions', ->
@db.transaction (trx) ->
expect(trx.commit()).to.be.fulfilled