def test_03_init_with_model_filter(self):
        """
        Test initializing an OdooModelCollection using a model_filter will not include models not matching the filter
        in the collection.
        :return:
        """
        # Mock Up
        mock_client = MagicMock()
        model_1 = MagicMock()
        model_1._name = 'test.model.1'
        model_1.fields = MagicMock(return_value={
            'm1_f1': {'type': 'boolean'},
            'm1_f2': {'type': 'char'},
            'm1_f3': {'type': 'many2one', 'relation': 'testing.model.2'},
        })
        model_2 = MagicMock()
        model_2._name = 'testing.model.2'
        model_2.fields = MagicMock(return_value={
            'm2_f1': {'type': 'text'},
            'm2_f2': {'type': 'many2many', 'relation': 'test.model.3'},
            'm2_f3': {'type': 'one2many', 'relation': 'test.model.1'},
        })
        mock_client.models = MagicMock(return_value={'Model 1': model_1, 'Model 2': model_2})
        mock_erppeek = MagicMock(return_value=mock_client)

        with patch('erppeek.Client', mock_erppeek):
            test_omc = OdooModelCollection('test.model')
            self.assertEqual(len(test_omc.classes), 2)
            self.assertIsInstance(test_omc.classes[0], OdooClass)
            self.assertIsInstance(test_omc.classes[1], OdooClass)
            self.assertEqual(len(test_omc.relation_models), 1)
            self.assertEqual(test_omc.relation_models[0], 'testing.model.2')
            self.assertEqual(test_omc.model_filter, 'test.model')
    def test_01_init(self):
        """
        Test initializing an OdooModelCollection starts a connection with an Odoo server using ERPPeek and
        initializes the parameters correctly.
        :return:
        """
        # Mock Up
        mock_client = MagicMock()
        model_1 = MagicMock()
        model_1._name = 'test.model.1'
        model_1.fields = MagicMock(return_value={
            'm1_f1': {'type': 'boolean'},
            'm1_f2': {'type': 'char'},
            'm1_f3': {'type': 'many2one', 'relation': 'test.model.2'},
        })
        model_2 = MagicMock()
        model_2._name = 'test.model.2'
        model_2.fields = MagicMock(return_value={
            'm2_f1': {'type': 'text'},
            'm2_f2': {'type': 'many2many', 'relation': 'test.model.3'},
            'm2_f3': {'type': 'one2many', 'relation': 'test.model.1'},
        })
        mock_client.models = MagicMock(return_value={'Model 1': model_1, 'Model 2': model_2})
        mock_erppeek = MagicMock(return_value=mock_client)

        with patch('erppeek.Client', mock_erppeek):
            test_omc = OdooModelCollection()
            self.assertIsInstance(test_omc.client, MagicMock)
            self.assertEqual(len(test_omc.classes), 3)
            self.assertIsInstance(test_omc.classes[0], OdooClass)
            self.assertIsInstance(test_omc.classes[1], OdooClass)
            self.assertIsInstance(test_omc.classes[2], OdooClass)
            self.assertEqual(len(test_omc.relation_models), 1)
            self.assertEqual(test_omc.relation_models[0], 'test.model.3')
            self.assertFalse(test_omc.model_filter)
    def test_01_init(self):
        """
        Test initializing an OdooModelCollection starts a connection with an Odoo server using ERPPeek and
        initializes the parameters correctly.
        :return:
        """
        # Mock Up
        mock_client = MagicMock()
        mock_model = MagicMock()
        model_1 = MagicMock()
        model_1._name = 'test.model.1'
        model_1.fields = MagicMock(return_value={
            'm1_f1': {'type': 'boolean'},
            'm1_f2': {'type': 'char'},
            'm1_f3': {'type': 'many2one', 'relation': 'test.model.2'},
        })
        model_2 = MagicMock()
        model_2._name = 'test.model.2'
        model_2.fields = MagicMock(return_value={
            'm2_f1': {'type': 'text'},
            'm2_f2': {'type': 'many2many', 'relation': 'test.model.3'},
            'm2_f3': {'type': 'one2many', 'relation': 'test.model.1'},
        })
        mock_client.models = MagicMock(return_value={'Model 1': model_1, 'Model 2': model_2})
        mock_client.model = MagicMock(return_value=mock_model)
        mock_erppeek = MagicMock(return_value=mock_client)

        def search(domain):
            if domain[0][2] == 'test.model.1':
                return [1]
            elif domain[0][2] == 'test.model.2':
                return [2]
            else:
                return [0]

        def browse(model_id):
            model_browse = MagicMock()
            if model_id == 1:
                model = MagicMock()
                model.model = 'test.model.2'
                model_browse.inherited_model_ids = [model]
            else:
                model_browse.inherited_model_ids = []
            return model_browse

        mock_model.search = search
        mock_model.browse = browse

        with patch('erppeek.Client', mock_erppeek):
            test_omc = OdooModelCollection()
            self.assertIsInstance(test_omc.client, MagicMock)
            self.assertEqual(len(test_omc.classes), 3)
            self.assertIsInstance(test_omc.classes[0], OdooClass)
            self.assertIsInstance(test_omc.classes[1], OdooClass)
            self.assertIsInstance(test_omc.classes[2], OdooClass)
            self.assertEqual(len(test_omc.relation_models), 1)
            self.assertEqual(test_omc.relation_models[0], 'test.model.3')
            self.assertFalse(test_omc.model_filter)
    def test_06_convert_collection_to_json(self):
        """
        Test json conversion is returned correctly.
        :return:
        """
        # Mock Up
        mock_client = MagicMock()
        model_1 = MagicMock()
        model_1._name = 'test.model.1'
        model_1.fields = MagicMock(return_value={
            'm1_f1': {'type': 'boolean'},
            'm1_f2': {'type': 'char'},
            'm1_f3': {'type': 'many2one', 'relation': 'test.model.2'},
        })
        model_2 = MagicMock()
        model_2._name = 'test.model.2'
        model_2.fields = MagicMock(return_value={
            'm2_f1': {'type': 'text'},
            'm2_f2': {'type': 'many2many', 'relation': 'test.model.3'},
            'm2_f3': {'type': 'one2many', 'relation': 'test.model.1'},
        })
        mock_client.models = MagicMock(return_value={'Model 1': model_1, 'Model 2': model_2})
        mock_erppeek = MagicMock(return_value=mock_client)

        with patch('erppeek.Client', mock_erppeek):
            test_omc = OdooModelCollection()
            json = [
                {
                    "fields": [{"type": "text", "name": "m2_f1"}],
                    "name": "test.model.2",
                    "relations": [
                        {"model": "test.model.1", "type": "one2many", "name": "m2_f3"},
                        {"model": "test.model.3", "type": "many2many", "name": "m2_f2"}
                    ]
                }, {
                    "fields": [{"type": "char", "name": "m1_f2"}, {"type": "boolean", "name": "m1_f1"}],
                    "name": "test.model.1",
                    "relations": [
                        {"model": "test.model.2", "type": "many2one", "name": "m1_f3"}
                    ]
                }, {
                    "fields": [],
                    "name": "test.model.3",
                    "relations": []
                }]
            self.assertListEqual(eval(test_omc.convert_collection_to_json()), json)
    def test_06_convert_collection_to_json(self):
        """
        Test json conversion is returned correctly.
        :return:
        """
        # Mock Up
        mock_client = MagicMock()
        mock_model = MagicMock()
        model_1 = MagicMock()
        model_1._name = 'test.model.1'
        model_1.fields = MagicMock(return_value={
            'm1_f1': {'type': 'boolean'},
            'm1_f2': {'type': 'char'},
            'm1_f3': {'type': 'many2one', 'relation': 'test.model.2'},
        })
        model_2 = MagicMock()
        model_2._name = 'test.model.2'
        model_2.fields = MagicMock(return_value={
            'm2_f1': {'type': 'text'},
            'm2_f2': {'type': 'many2many', 'relation': 'test.model.3'},
            'm2_f3': {'type': 'one2many', 'relation': 'test.model.1'},
        })
        mock_client.models = MagicMock(return_value={'Model 1': model_1, 'Model 2': model_2})
        mock_client.model = MagicMock(return_value=mock_model)
        mock_erppeek = MagicMock(return_value=mock_client)

        def search(domain):
            if domain[0][2] == 'test.model.1':
                return [1]
            elif domain[0][2] == 'test.model.2':
                return [2]
            else:
                return [0]

        def browse(model_id):
            model_browse = MagicMock()
            if model_id == 1:
                model = MagicMock()
                model.model = 'test.model.2'
                model_browse.inherited_model_ids = [model]
            else:
                model_browse.inherited_model_ids = []
            return model_browse

        mock_model.search = search
        mock_model.browse = browse

        with patch('erppeek.Client', mock_erppeek):
            test_omc = OdooModelCollection()
            json = [
                {
                    "fields": [{"type": "text", "name": "m2_f1"}],
                    "name": "test.model.2",
                    "relations": [
                        {"model": "test.model.1", "type": "one2many", "name": "m2_f3"},
                        {"model": "test.model.3", "type": "many2many", "name": "m2_f2"}
                    ]
                }, {
                    "fields": [{"type": "char", "name": "m1_f2"}, {"type": "boolean", "name": "m1_f1"}],
                    "name": "test.model.1",
                    "relations": [
                        {"model": "test.model.2", "type": "many2one", "name": "m1_f3"}
                    ]
                }, {
                    "fields": [],
                    "name": "test.model.3",
                    "relations": []
                }]
            self.assertListEqual(eval(test_omc.convert_collection_to_json()), json)