ipc = require 'ipc'
TestModel = require '../fixtures/db-test-model'
Attributes = require '../../src/flux/attributes'
DatabaseSetupQueryBuilder = require '../../src/flux/stores/database-setup-query-builder'

describe "DatabaseSetupQueryBuilder", ->
  beforeEach ->
    @builder = new DatabaseSetupQueryBuilder()

  describe "setupQueriesForTable", ->
    it "should return the queries for creating the table and the primary unique index", ->
      TestModel.attributes =
        'attrQueryable': Attributes.DateTime
          queryable: true
          modelKey: 'attrQueryable'
          jsonKey: 'attr_queryable'

        'attrNonQueryable': Attributes.Collection
          modelKey: 'attrNonQueryable'
          jsonKey: 'attr_non_queryable'
      queries = @builder.setupQueriesForTable(TestModel)
      expected = [
        'CREATE TABLE IF NOT EXISTS `TestModel` (id TEXT PRIMARY KEY,data BLOB,attr_queryable INTEGER)',
        'CREATE UNIQUE INDEX IF NOT EXISTS `TestModel_id` ON `TestModel` (`id`)'
      ]
      for query,i in queries
        expect(query).toBe(expected[i])

    it "should correctly create join tables for models that have queryable collections", ->
      TestModel.configureWithCollectionAttribute()
      queries = @builder.setupQueriesForTable(TestModel)
      expected = [
        'CREATE TABLE IF NOT EXISTS `TestModel` (id TEXT PRIMARY KEY,data BLOB,client_id TEXT,server_id TEXT)',
        'CREATE UNIQUE INDEX IF NOT EXISTS `TestModel_id` ON `TestModel` (`id`)',
        'CREATE TABLE IF NOT EXISTS `TestModel-Label` (id TEXT KEY, `value` TEXT)'
        'CREATE UNIQUE INDEX IF NOT EXISTS `TestModel_Label_id_val` ON `TestModel-Label` (`id`,`value`)',
      ]
      for query,i in queries
        expect(query).toBe(expected[i])

    it "should use the correct column type for each attribute", ->
      TestModel.configureWithAllAttributes()
      queries = @builder.setupQueriesForTable(TestModel)
      expect(queries[0]).toBe('CREATE TABLE IF NOT EXISTS `TestModel` (id TEXT PRIMARY KEY,data BLOB,datetime INTEGER,string-json-key TEXT,boolean INTEGER,number INTEGER)')

    describe "when the model provides additional sqlite config", ->
      it "the setup method should return these queries", ->
        TestModel.configureWithAdditionalSQLiteConfig()
        spyOn(TestModel.additionalSQLiteConfig, 'setup').andCallThrough()
        queries = @builder.setupQueriesForTable(TestModel)
        expect(TestModel.additionalSQLiteConfig.setup).toHaveBeenCalledWith()
        expect(queries.pop()).toBe('CREATE INDEX IF NOT EXISTS ThreadListIndex ON Thread(last_message_received_timestamp DESC, account_id, id)')

      it "should not fail if additional config is present, but setup is undefined", ->
        delete TestModel.additionalSQLiteConfig['setup']
        @m = new TestModel(id: 'local-6806434c-b0cd', body: 'hello world')
        expect( => @builder.setupQueriesForTable(TestModel)).not.toThrow()
