def test_load_dict(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }

        dict_data = {'guid': 'blah', 'name': 'sure', 'hats': False}

        test_model = BaseModel()
        test_model.load(dict_data)

        for key in dict_data:
            self.assertEqual(getattr(test_model, key), dict_data[key], 'Loaded data does not match data from source')
    def test_load_list(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }

        row_data = ['29f4de658', 'wat', False]

        test_model = BaseModel()
        test_model.load(row_data)

        self.assertEqual(test_model.guid, row_data[0], 'Loaded data does not match data from source')
        self.assertEqual(test_model.name, row_data[1], 'Loaded data does not match data from source')
        self.assertEqual(test_model.hats, row_data[2], 'Loaded data does not match data from source')
    def test_parse_criteria(self):
        data = {
            'empty': {
                'criteria': {},
                'expected': '1'
            },

            'base': {
                'criteria': {'one': 1},
                'expected': ' one = 1 '
            },

            'nested': {
                'criteria': {'OR': {'two': 2, 'one': 1}},
                'expected': ' ( two = 2 OR one = 1 ) '
            },

            'negation': {
                'criteria': {'AND': {'NOT': {'one': 1}, 'three': 3}},
                'expected': ' ( NOT ( one = 1 ) AND three = 3 ) '
            },

            'complex': {
                'criteria': {'OR': {'one': 1, 'NOT': {'two': 2}, 'AND': {'three': 3, 'four': 4, 'NOT': {'AND': {'five': 5, 'six': 6}}}}},
                'expected': ' ( NOT ( two = 2 ) OR ( four = 4 AND NOT ( ( six = 6 AND five = 5 ) ) AND three = 3 ) OR one = 1 ) '
            }
        }

        for dataSet in data:
            parsed = BaseModel.parse_criteria(data[dataSet]['criteria'])
            self.assertEqual(
                parsed, 
                data[dataSet]['expected'], 
                'Criteria set %s did not match expected:\nexpected:`%s`\nactual:  `%s`' % (dataSet, data[dataSet]['expected'], parsed))
    def test_load_ignore_unknown_fields(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }

        dict_data = {'guid': 'blah', 'name': 'sure', 'hats': False, 'banana': 'hammock', 'number': 24387}

        test_model = BaseModel()
        test_model.load(dict_data)

        self.assertEqual(test_model.guid, dict_data['guid'], 'Loaded data does not match data from source')
        self.assertEqual(test_model.name, dict_data['name'], 'Loaded data does not match data from source')
        self.assertEqual(test_model.hats, dict_data['hats'], 'Loaded data does not match data from source')
        self.assertFalse(hasattr(test_model, 'banana'), 'Loaded an unknown field that we should not have')
        self.assertFalse(hasattr(test_model, 'number'), 'Loaded an unknown field that we should not have')
    def test_findOne(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        result = BaseModel.findOne({'guid': 'a1'})

        self.assertEqual(result.guid, 'a1')
        self.assertEqual(result.name, 'lol')
        self.assertTrue(result.hats)
    def test_create_empty(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        model = BaseModel.create()

        self.assertTrue(model._new)
        self.assertEqual(model.guid, None)
        self.assertEqual(model.name, None)
        self.assertEqual(model.hats, None)
    def test_findAll_criteria(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        results = BaseModel.findAll({'hats': False})

        self.assertEqual(len(results), 1)

        self.assertEqual(results[0].guid, 'b2')
        self.assertEqual(results[0].name, 'rofl')
        self.assertFalse(results[0].hats)
    def test_save(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        data = {
            'guid': '123abc',
            'name': 'banana',
            'hats': True
        }
        model = BaseModel.create(data)

        model.name = 'notabanana'
        model.hats = False

        model.save()

        loaded_model = BaseModel.findOne({'guid': '123abc'})

        self.assertEqual(model.guid, loaded_model.guid)
        self.assertEqual(model.name, loaded_model.name)
        self.assertEqual(model.hats, loaded_model.hats)
    def test_create_from_data(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        data = {
            'guid': '123abc',
            'name': 'banana',
            'hats': True
        }
        model = BaseModel.create(data)

        self.assertTrue(model._new)
        self.assertEqual(model.guid, data['guid'])
        self.assertEqual(model.name, data['name'])
        self.assertEqual(model.hats, data['hats'])
    def test_findAll(self):
        BaseModel.FIELDS = {
            0: 'guid',
            1: 'name',
            2: 'hats'
        }
        results = BaseModel.findAll()

        self.assertEqual(len(results), 2)

        for result in results:
            if result.guid == 'a1':
                self.assertEqual(result.name, 'lol')
                self.assertTrue(result.hats)
            elif result.guid == 'b2':
                self.assertEqual(result.name, 'rofl')
                self.assertFalse(result.hats)
 def test_findOne_empty(self):
     result = BaseModel.findOne({'guid': 'notreal'})
     self.assertEqual(result, None)
 def test_findAll_empty(self):
     result = BaseModel.findAll({'name': 'notreal'})
     self.assertEqual(result, [])