{execFile, spawn} = require 'child_process'
pg = require 'pg'

Store = require '../../src/store/postgres'

module.exports =
    setUp: (next) ->
        env = this
        env.connections = []
        throw new Error 'missing PSQL Environment Variable' unless process?.env?.PSQL
        getConnection = (cb) ->
            client = new pg.Client process.env.PSQL
            client.connect()
            env.connections.push client
            cb null, client
        env.store = Store getConnection
        execFile 'script/reset-db', (err, stdout, stderr) ->
            throw err if err?
            console.log stdout.toString()
            console.log stderr.toString()
            next()

    tearDown: (next) ->
        env = this
        env.connections.forEach (connection) ->
            connection.end()
        env.connections = []
        next()

    'retrieve empty values if id does not exist': (test) ->
        @store.getByIdAndSecret 'random_id', 'random_secret', (err, result) ->
            test.ok not err?, "getByIdAndSecret returns an error (#{err})"
            test.deepEqual {}, result
            test.done()

    'set and get values': (test) ->
        store = @store
        store.setByIdAndSecret 'id', 'secret', {foo: 'bar'}, (err) ->
            test.ifError err
            store.getByIdAndSecret 'id', 'secret', (err, result) ->
                test.ifError err
                test.equal 'bar', result.foo
                test.done()

    'update works': (test) ->
        store = @store
        store.setByIdAndSecret 'id', 'secret', {x: 1}, (err) ->
            test.ifError err
            store.setByIdAndSecret 'id', 'secret', {x: 2}, (err) ->
                test.ifError err
                store.getByIdAndSecret 'id', 'secret', (err, result) ->
                    test.ifError err
                    test.equal 2, result.x
                    test.done()

    'test delete older': (test) ->
        store = @store
        store.setByIdAndSecret 'id', 'secret', {x: 1}, (err) ->
            throw err if err?
            store.deleteOlderThen new Date(), (err) ->
                throw err if err?
                store.getByIdAndSecret 'id', 'secret', (err, session) ->
                    throw err if err?
                    test.deepEqual {}, session
                    test.done()

    'correct secret is needed to get session data': (test) ->
        store = @store
        store.setByIdAndSecret 'id', 'secret', {x: 1}, (err) ->
            test.ifError err
            store.getByIdAndSecret 'id', 'wrong-secret', (err, data) ->
                test.ifError err
                test.deepEqual {}, data
                test.done()

    'correct secret is needed to alter session data': (test) ->
        store = @store
        store.setByIdAndSecret 'id', 'secret', {x: 1}, (err) ->
            test.ifError err
            store.setByIdAndSecret 'id', 'wrong-secret', {injected: 'session'}, (err) ->
                test.ifError err
                store.getByIdAndSecret 'id', 'secret', (err, session) ->
                    test.ifError err
                    test.deepEqual {x: 1}, session
                    test.done()
