Esempio n. 1
0
class ApiTest(unittest.TestCase):
    def setUp(self):
        self.maxDiff = None
        client = MongoClient()
        client.drop_database('metaphor2_test_db')
        self.db = client.metaphor2_test_db
        self.schema = Schema(self.db)

        self.db.metaphor_schema.insert_one({
            "specs" : {
                "employee" : {
                    "fields" : {
                        "name" : {
                            "type" : "str"
                        },
                        "age": {
                            "type": "int"
                        },
                        "division": {
                            "type": "link",
                            "target_spec_name": "division",
                        },
                        "division_link": {
                            "type": "calc",
                            "calc_str": "self.division",
                        },
                        "parttime_division_name": {
                            "type": "calc",
                            "calc_str": "self.name + (self.parent_section_parttimers.parent_division_sections.name)",
                        },
                    },
                },
                "division": {
                    "fields": {
                        "name": {
                            "type": "str",
                        },
                        "yearly_sales": {
                            "type": "int",
                        },
                        "sections": {
                            "type": "orderedcollection",
                            "target_spec_name": "section",
                        },
                        "primary_sections": {
                            "type": "calc",
                            "calc_str": "self.sections[name='primary']",
                        },
                        "average_section_total": {
                            "type": "calc",
                            "calc_str": "average(self.sections.section_total)",
                        },
                        "average_bracket_calc": {
                            "type": "calc",
                            "calc_str": "average(self.sections.section_total) + ((10 + sum(self.sections.section_total)) / 5)",
                        },
                        "older_employees": {
                            "type": "calc",
                            "calc_str": "self.link_employee_division[age>40]",
                        },
                    },
                },
                "section": {
                    "fields": {
                        "name": {
                            "type": "str",
                        },
                        "section_total": {
                            "type": "int",
                        },
                        "division_name": {
                            "type": "calc",
                            "calc_str": "self.parent_division_sections.name",
                        },
                        "distance_from_average": {
                            "type": "calc",
                            "calc_str": "self.section_total - average(self.parent_division_sections.sections.section_total)",
                        },
                        "parttimers": {
                            "type": "orderedcollection",
                            "target_spec_name": "employee",
                        },
                    },
                },
            },
            "root": {
                "employees": {
                    "type": "collection",
                    "target_spec_name": "employee",
                },
                "divisions": {
                    "type": "collection",
                    "target_spec_name": "division",
                }
            },
        })
        self.schema.load_schema()

        self.api = Api(self.schema)

    def test_calc_results(self):
        employee_id_1 = self.api.post('employees', {'name': 'ned', 'age': 41})
        employee_id_2 = self.api.post('employees', {'name': 'bob', 'age': 31})
        employee_id_3 = self.api.post('employees', {'name': 'fred', 'age': 21})

        division_id_1 = self.api.post('divisions', {'name': 'sales', 'yearly_sales': 100})

        self.api.patch('employees/%s' % employee_id_1, {'division': division_id_1})
        self.api.patch('employees/%s' % employee_id_2, {'division': division_id_1})

        section_id_1 = self.api.post('/divisions/%s/sections' % division_id_1, {'name': 'primary', 'section_total': 120})
        section_id_2 = self.api.post('/divisions/%s/sections' % division_id_1, {'name': 'secondary', 'section_total': 90})

        # test simple type
        section_1 = self.api.get('/divisions/%s/sections/%s' % (division_id_1, section_id_1))

        self.assertEquals('sales', section_1['division_name'])

        # test resource type
        division_1 = self.api.get('/divisions/%s' % division_id_1)
        self.assertEquals({
            '_meta': {'is_collection': False, 'spec': {'name': 'division'}},
            'id': division_id_1,
            'link_employee_division': '/divisions/%s/link_employee_division' % division_id_1,
            'name': 'sales',
            'average_section_total': 105.0,
            'average_bracket_calc': 149.0,
            'older_employees': '/divisions/%s/older_employees' % division_id_1,
            'primary_sections': '/divisions/%s/primary_sections' % division_id_1,
            'sections': '/divisions/%s/sections' % division_id_1,
            'self': '/divisions/%s' % division_id_1,
            'yearly_sales': 100}, division_1)

        # test calculated resource collection endpoint
        older_employees = self.api.get('/divisions/%s/older_employees' % division_id_1)['results']
        self.assertEquals(1, len(older_employees))

    def test_calc_link_1(self):
        employee_id_1 = self.api.post('employees', {'name': 'ned', 'age': 41})

    def test_calc_link(self):
        division_id_1 = self.api.post('divisions', {'name': 'sales', 'yearly_sales': 100})
        employee_id_1 = self.api.post('employees', {'name': 'ned', 'age': 41, 'division': division_id_1})

        self.assertEqual({
            '_meta': {'is_collection': False, 'spec': {'name': 'employee'}},
            'age': 41,
            'division': '/divisions/%s' % division_id_1,
            'division_link': '/divisions/%s' % division_id_1,
            'id': employee_id_1,
            'name': 'ned',
            'parent_section_parttimers': None,
            'parttime_division_name': None,
            'self': '/employees/%s' % employee_id_1}
            , self.api.get('/employees/%s' % employee_id_1))

    def test_calc_parent_links(self):
        division_id_1 = self.api.post('divisions', {'name': 'sales', 'yearly_sales': 100})
        section_1 = self.api.post('/divisions/%s/sections' % (division_id_1,), {'name': 'hr'})
        parttimer_1 = self.api.post('/divisions/%s/sections/%s/parttimers' % (division_id_1, section_1), {'name': 'bob'})

        parttimer = self.api.get('/divisions/%s/sections/%s/parttimers/%s' % (division_id_1, section_1, parttimer_1))

        self.assertEqual('bobsales', parttimer['parttime_division_name'])
Esempio n. 2
0
class ApiTest(unittest.TestCase):
    def setUp(self):
        self.maxDiff = None
        client = MongoClient()
        client.drop_database('metaphor2_test_db')
        self.db = client.metaphor2_test_db
        self.schema = Schema(self.db)
        self.schema.create_initial_schema()

        self.employee_spec = self.schema.create_spec('employee')
        self.schema.create_field('employee', 'name', 'str')
        self.schema.create_field('employee', 'age', 'int')
        self.schema.create_field('employee', 'created', 'datetime')

        self.division_spec = self.schema.create_spec('division')
        self.schema.create_field('division', 'name', 'str')
        self.schema.create_field('division', 'employees', 'collection', 'employee')
        self.schema.create_field('division', 'parttimers', 'linkcollection', 'employee')
        self.schema.create_field('division', 'contractors', 'linkcollection', 'employee')

        self.schema.create_field('root', 'employees', 'collection', 'employee')
        self.schema.create_field('root', 'former_employees', 'collection', 'employee')
        self.schema.create_field('root', 'divisions', 'collection', 'division')

        self.calcs_spec = self.schema.create_spec('calcs')
        self.schema.create_field('calcs', 'total_employees', 'calc', calc_str='sum(employees.age)')
        self.schema.create_field('calcs', 'total_former_employees', 'calc', calc_str='sum(former_employees.age)')
        #self.schema.create_field('calcs', 'total_division_parttimers', 'calc', calc_str='sum(divisions.parttimers.age)')
        #self.schema.create_field('calcs', 'total_division_contractors', 'calc', calc_str='sum(divisions.contractors.age)')

        self.schema.create_field('root', 'calcs', 'collection', 'calcs')

        self.api = Api(self.schema)

    def test_move_resource(self):
        employee_id_1 = self.api.post('/employees', {'name': 'bob', 'age': 1})

        # check calc
        self.calcs_id = self.api.post('/calcs', {})
        self.assertEqual(1, self.api.get('/calcs/%s' % self.calcs_id)['total_employees'])

        self.api.put('/former_employees', {'_from': '/employees/%s' % employee_id_1})

        former_employees = self.api.get('/former_employees')
        self.assertEqual(1, former_employees['count'])

        self.assertEqual('bob', former_employees['results'][0]['name'])

        # no longer at original collection
        self.assertEqual(0, self.api.get('/employees')['count'])

        # assert calc update
        # apparently sum of empty list gives null
        self.assertEqual(None, self.api.get('/calcs/%s' % self.calcs_id)['total_employees'])
        self.assertEqual(1, self.api.get('/calcs/%s' % self.calcs_id)['total_former_employees'])

    def test_move_collection(self):
        employee_id_1 = self.api.post('/employees', {'name': 'bob', 'age': 1})
        employee_id_2 = self.api.post('/employees', {'name': 'ned', 'age': 1})

        self.api.put('/former_employees', {'_from': '/employees'})

        former_employees = self.api.get('/former_employees')
        self.assertEqual(2, former_employees['count'])

        self.assertEqual('bob', former_employees['results'][0]['name'])
        self.assertEqual('ned', former_employees['results'][1]['name'])

        # no longer at original collection
        self.assertEqual(0, self.api.get('/employees')['count'])

    def test_move_between_nested_collections(self):
        division_id_1 = self.api.post('/divisions', {'name': 'sales'})
        division_id_2 = self.api.post('/divisions', {'name': 'marketting'})

        employee_id_1 = self.api.post('/divisions/%s/employees' % division_id_1, {'name': 'bob'})
        employee_id_2 = self.api.post('/divisions/%s/employees' % division_id_2, {'name': 'ned'})

        self.api.put('/divisions/%s/employees' % division_id_2, {'_from': '/divisions/%s/employees/%s' % (division_id_1, employee_id_1)})

        self.assertEqual(0, self.api.get('/divisions/%s/employees' % division_id_1)['count'])
        self.assertEqual(2, self.api.get('/divisions/%s/employees' % division_id_2)['count'])

        self.assertEqual('bob', self.api.get('/divisions/%s/employees/%s' % (division_id_2, employee_id_1))['name'])
        self.assertEqual('ned', self.api.get('/divisions/%s/employees/%s' % (division_id_2, employee_id_2))['name'])

    def test_basic_update(self):
        employee_id_1 = self.api.post('/employees', {'name': 'bob', 'age': 1})

        # check calc
        self.calcs_id = self.api.post('/calcs', {})
        self.assertEqual(1, self.api.get('/calcs/%s' % self.calcs_id)['total_employees'])
Esempio n. 3
0
class UpdaterBackgroundTest(unittest.TestCase):
    def setUp(self):
        self.maxDiff = None
        client = MongoClient()
        client.drop_database('metaphor2_test_db')
        self.db = client.metaphor2_test_db
        self.schema = Schema(self.db)

        self.api = Api(self.schema)

        self.employee_spec = self.schema.add_spec('employee')
        self.schema.add_field(self.employee_spec, 'name', 'str')
        self.schema.add_field(self.employee_spec, 'age', 'int')

        self.division_spec = self.schema.add_spec('division')
        self.schema.add_field(self.division_spec, 'name', 'str')
        self.schema.add_field(self.division_spec, 'employees', 'collection',
                              'employee')
        self.schema.add_field(self.division_spec, 'managers', 'linkcollection',
                              'employee')
        self.schema.add_calc(self.division_spec, 'older_managers',
                             'self.managers[age>30]')

        self.company_spec = self.schema.add_spec('company')
        self.schema.add_field(self.company_spec, 'name', 'str')
        self.schema.add_field(self.company_spec, 'division', 'link',
                              'division')
        self.schema.add_calc(self.company_spec, 'max_age',
                             'max(self.division.older_managers.age)')

        self.schema.add_field(self.schema.root, 'companies', 'collection',
                              'company')
        self.schema.add_field(self.schema.root, 'divisions', 'collection',
                              'division')

    def test_update(self):
        company_1_id = self.api.post('/companies', {'name': 'Bobs Burgers'})
        division_1_id = self.api.post('/divisions', {'name': 'Kitchen'})

        employee_1_id = self.api.post(
            '/divisions/%s/employees' % division_1_id, {
                'name': 'Bob',
                'age': 38
            })
        employee_2_id = self.api.post(
            '/divisions/%s/employees' % division_1_id, {
                'name': 'Linda',
                'age': 36
            })

        self.api.post('/divisions/%s/managers' % division_1_id,
                      {'id': employee_1_id})
        self.api.post('/divisions/%s/managers' % division_1_id,
                      {'id': employee_2_id})

        self.assertEquals(
            None,
            self.api.get('/companies/%s' % company_1_id)['max_age'])

        self.api.patch('/companies/%s' % company_1_id,
                       {'division': division_1_id})

        self.assertEquals(
            38,
            self.api.get('/companies/%s' % company_1_id)['max_age'])