Example #1
0
    def test_execute_query(self):
        label = data_mocking.create_label({
            'name': 'apple',
        }, self.session)
        label_file = data_mocking.create_label_file(
            {
                'label': label,
                'project_id': self.project.id
            }, self.session)
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            query_string2 = 'labels.apple > 3'
            query_creator = QueryCreator(session=self.session,
                                         project=self.project,
                                         member=self.member)
            # Correct case
            diffgram_query_obj = query_creator.create_query(
                query_string=query_string2)
            executor = SqlAlchemyQueryExecutor(
                session=self.session, diffgram_query=diffgram_query_obj)
            sql_alchemy_query, execution_log = executor.execute_query()

            self.assertEqual(type(sql_alchemy_query), Query)
            self.assertEqual(len(executor.log['error'].keys()), 0)
Example #2
0
 def test_job_view_core(self):
     num_jobs = 3
     metadata_proposed = {
         'builder_or_trainer': {
             'mode': 'builder'
         },
         'limit': num_jobs,
         'my_jobs_only': False,
         'project_string_id': self.project.project_string_id
     }
     all_jobs = []
     for i in range(0, num_jobs):
         job = data_mocking.create_job(
             {
                 'name': 'my-test-job-{}'.format(i),
                 'project': self.project
             }, self.session)
         all_jobs.append(job)
     self.session.commit()
     with self.app.test_request_context():
         common_actions.add_auth_to_session(flask.session,
                                            self.project.users[0])
         result = job_view_core(self.session,
                                metadata_proposed,
                                output_mode="serialize",
                                user=self.project.users[0])
     logger.info(result)
     self.assertEqual(len(result), num_jobs - 1)
Example #3
0
 def test_compare_expr(self):
     label = data_mocking.create_label({
         'name': 'apple',
     }, self.session)
     label_file = data_mocking.create_label_file(
         {
             'label': label,
             'project_id': self.project.id
         }, self.session)
     with self.app.test_request_context():
         common_actions.add_auth_to_session(flask.session,
                                            self.project.users[0])
         query_string2 = 'labels.apple > 3'
         query_creator = QueryCreator(session=self.session,
                                      project=self.project,
                                      member=self.member)
         # Correct case
         diffgram_query_obj = query_creator.create_query(
             query_string=query_string2)
         executor = SqlAlchemyQueryExecutor(
             session=self.session, diffgram_query=diffgram_query_obj)
         sql_alchemy_query, execution_log = executor.execute_query()
         result = executor.compare_expr(diffgram_query_obj.tree.children[0].
                                        children[0].children[0].children[0])
         self.assertEqual(len(execution_log['error'].keys()), 0)
         self.assertIsNotNone(result)
         self.assertIsNotNone(result.query_condition)
         self.assertTrue(executor.valid)
Example #4
0
    def test__parse_value(self):
        label = data_mocking.create_label({
            'name': 'apple',
        }, self.session)
        label_file = data_mocking.create_label_file(
            {
                'label': label,
                'project_id': self.project.id
            }, self.session)
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            query_string = 'labels.x > 5'  # dummy query
            query_creator = QueryCreator(session=self.session,
                                         project=self.project,
                                         member=self.member)
            diffgram_query_obj = query_creator.create_query(
                query_string=query_string)
            executor = SqlAlchemyQueryExecutor(
                session=self.session, diffgram_query=diffgram_query_obj)

            token = Token(value='labels.apple', type_='dummy')
            value = executor._SqlAlchemyQueryExecutor__parse_value(token)
            self.assertEqual(type(value), ScalarSelect)

            token = Token(value='file.something', type_='dummy')
            value = executor._SqlAlchemyQueryExecutor__parse_value(token)
            self.assertEqual(type(value), BinaryExpression)
Example #5
0
 def test_create_query(self):
     label = data_mocking.create_label({
         'name': 'apple',
     }, self.session)
     label_file = data_mocking.create_label_file(
         {
             'label': label,
             'project_id': self.project.id
         }, self.session)
     query_str = 'labels.apple > 0'
     with self.app.test_request_context():
         common_actions.add_auth_to_session(flask.session,
                                            self.project.users[0])
         creator = QueryCreator(session=self.session,
                                project=self.project,
                                member=self.member)
         result = creator.create_query(query_string=query_str)
         self.assertTrue(type(result) == DiffgramQuery)
         self.assertEqual(result.tree.data, 'start')
         self.assertEqual(result.tree.children[0].data, 'expr')
         self.assertEqual(result.tree.children[0].children[0].data, 'term')
         self.assertEqual(
             result.tree.children[0].children[0].children[0].data, 'factor')
         self.assertEqual(
             result.tree.children[0].children[0].children[0].children[0].
             data, 'compare_expr')
Example #6
0
    def test_filter_by_project(self):
        other_project_data = data_mocking.create_project_with_context(
            {
                'users': [{
                    'username': '******',
                    'email': '*****@*****.**',
                    'password': '******',
                }]
            }, self.session)
        other_project = other_project_data['project']
        other_job = data_mocking.create_job(
            {
                'name': 'my-testother-job-{}'.format(1),
                'project': other_project
            }, self.session)
        query = self.session.query(Job)
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            result = filter_by_project(
                session=self.session,
                project_string_id=self.project.project_string_id,
                query=query)

        jobs = result.all()
        job_ids = [x.id for x in jobs]
        self.assertTrue(other_job.id not in job_ids)
Example #7
0
    def test_task_next_issue(self):
        # Create mock tasks
        num_tasks = 5
        job = data_mocking.create_job(
            {
                'name': 'my-test-job-{}'.format(1),
                'project': self.project
            }, self.session)
        all_tasks = []
        for i in range(0, num_tasks):
            task = data_mocking.create_task(
                {
                    'name': 'task{}'.format(i),
                    'job': job
                }, self.session)
            all_tasks.append(task)

        issue1 = data_mocking.create_discussion(
            {
                'title': 'test',
                'description': 'test',
                'project_id': self.project.id
            }, self.session)
        issue1.attach_element(session=self.session,
                              element={
                                  'type': 'task',
                                  'id': all_tasks[2].id
                              })
        issue2 = data_mocking.create_discussion(
            {
                'title': 'test2',
                'description': 'test2',
                'project_id': self.project.id
            }, self.session)
        issue2.attach_element(session=self.session,
                              element={
                                  'type': 'task',
                                  'id': all_tasks[4].id
                              })

        with self.client.session_transaction() as session:
            endpoint = "/api/v1/task/{}/next-task-with-issues".format(
                all_tasks[0].id)
            credentials = b64encode("{}:{}".format(
                self.auth_api.client_id,
                self.auth_api.client_secret).encode()).decode('utf-8')
            session['Authorization'] = credentials
            common_actions.add_auth_to_session(session, self.project.users[0])
        response = self.client.post(endpoint,
                                    data=json.dumps({}),
                                    headers={
                                        'directory_id':
                                        str(self.project.directory_default_id),
                                        'Authorization':
                                        'Basic {}'.format(credentials)
                                    })
        data = response.json
        self.assertEqual(response.status_code, 200)
        self.assertEqual(data['task_id'], all_tasks[2].id)
Example #8
0
    def test_get_video_frame_from_task(self):
        # Create mock task
        job = data_mocking.create_job({
            'name': 'my-test-job-{}'.format(1),
            'project': self.project
        }, self.session)
        video_file = data_mocking.create_file({
            'project_id': self.project.id,
            'type': 'video'
        }, self.session)
        frames_list = []
        # Mock Frames
        for i in range(0, 10):
            frame = data_mocking.create_file({
                'project_id': self.project.id,
                'video_parent_file_id': video_file.id,
                'frame_number': i,
                'type': 'frame'
            }, self.session)
            frames_list.append(frame)

        task = data_mocking.create_task({
            'name': 'tasktest',
            'job': job,
            'file': video_file
        }, self.session)

        request_data = {
            'frame_list': [1, 2, 3],
            'project_string_id': self.project.project_string_id,
            'mode_data': 'list'
        }

        endpoint = "/api/v1/task/{}/video/single/{}/frame-list/".format(task.id, video_file.id)
        with self.client.session_transaction() as session:
            auth_api = common_actions.create_project_auth(project = self.project, session = self.session)
            credentials = b64encode("{}:{}".format(auth_api.client_id, auth_api.client_secret).encode()).decode(
                'utf-8')
            session['Authorization'] = credentials
            common_actions.add_auth_to_session(session, self.project.users[0])
        response = self.client.post(
            endpoint,
            data = json.dumps(request_data),
            headers = {
                'directory_id': str(job.project.directory_default_id),
                'Authorization': 'Basic {}'.format(credentials)
            }
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.json['url_list']), 3)
        i = 1
        for elm in response.json['url_list']:
            self.assertEqual(elm['frame_number'], i)
            i += 1
Example #9
0
    def test_sync_events_list_api(self):
        # Create mock tasks
        num_events = 5
        job = data_mocking.create_job(
            {
                'name': 'my-test-job-{}'.format(1),
                'project': self.project
            }, self.session)
        all_sync_events = []
        for i in range(0, num_events):
            sync_event = data_mocking.create_sync_event(
                {
                    'description': 'syncevent{}'.format(i),
                    'job_id': job.id,
                    'project': self.project
                }, self.session)
            all_sync_events.append(sync_event)

        request_payload = {
            'metadata': {
                'job_id': job.id,
                'mode_data': 'list',
                'project_string_id': self.project.project_string_id
            }
        }

        endpoint = "/api/v1/sync-events/list"

        with self.client.session_transaction() as session:
            auth_api = common_actions.create_project_auth(project=self.project,
                                                          session=self.session)
            credentials = b64encode("{}:{}".format(
                auth_api.client_id,
                auth_api.client_secret).encode()).decode('utf-8')
            session['Authorization'] = credentials
            common_actions.add_auth_to_session(session, self.project.users[0])
        response = self.client.post(endpoint,
                                    data=json.dumps(request_payload),
                                    headers={
                                        'directory_id':
                                        str(job.project.directory_default_id),
                                        'Authorization':
                                        'Basic {}'.format(credentials)
                                    })
        print(response.data)
        self.assertEqual(response.status_code, 200)
        new_session = sessionMaker.session_factory()
        self.assertEqual(len(response.json['sync_events_list']), num_events)
Example #10
0
    def test_get_suggestions(self):
        query_str = ''
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            creator = QueryCreator(self.session, self.project, self.member)
            result, type = creator.get_suggestions(query_string=query_str)
            self.assertTrue('labels' in result)
            self.assertTrue('file' in result)
            self.assertEqual(type, 'entities')
            label = data_mocking.create_label({
                'name': 'apple',
            }, self.session)
            label_file = data_mocking.create_label_file(
                {
                    'label': label,
                    'project_id': self.project.id
                }, self.session)
            label2 = data_mocking.create_label({
                'name': 'car',
            }, self.session)
            label_file2 = data_mocking.create_label_file(
                {
                    'label': label2,
                    'project_id': self.project.id
                }, self.session)
            label3 = data_mocking.create_label({
                'name': 'person',
            }, self.session)
            label_file3 = data_mocking.create_label_file(
                {
                    'label': label3,
                    'project_id': self.project.id
                }, self.session)

            query_str = 'labels.'
            result, type = creator.get_suggestions(query_string=query_str)

            self.assertEqual(type, 'labels')
            self.assertTrue('apple' in result)
            self.assertTrue('car' in result)
            self.assertTrue('person' in result)

            query_str = 'file.'
            result, type = creator.get_suggestions(query_string=query_str)

            self.assertEqual(type, 'labels')
Example #11
0
    def test__validate_expression(self):
        label = data_mocking.create_label({
            'name': 'apple',
        }, self.session)
        label_file = data_mocking.create_label_file(
            {
                'label': label,
                'project_id': self.project.id
            }, self.session)
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            query_string = 'labels.x > 5'  # dummy query
            query_creator = QueryCreator(session=self.session,
                                         project=self.project,
                                         member=self.member)
            diffgram_query_obj = query_creator.create_query(
                query_string=query_string)
            executor = SqlAlchemyQueryExecutor(
                session=self.session, diffgram_query=diffgram_query_obj)

            token = Token(value='something', type_='dummy')
            token2 = Token(value='5', type_='dummy')
            operator = Token(value='>', type_='dummy')
            value = executor._SqlAlchemyQueryExecutor__validate_expression(
                token, token2, operator)
            self.assertFalse(value, False)
            self.assertIsNotNone(executor.log['error'].get('compare_expr'))

            token = Token(value='labels.apple', type_='dummy')
            token2 = Token(value='5', type_='dummy')
            operator = Token(value='>', type_='dummy')
            executor.log['error'] = {}
            value = executor._SqlAlchemyQueryExecutor__validate_expression(
                token, token2, operator)
            self.assertTrue(value)
            self.assertEqual(len(executor.log['error'].keys()), 0)

            token = Token(value='file.sensor', type_='dummy')
            token2 = Token(value='sensorA', type_='dummy')
            operator = Token(value='>', type_='dummy')
            executor.log['error'] = {}
            value = executor._SqlAlchemyQueryExecutor__validate_expression(
                token, token2, operator)
            self.assertFalse(value)
            self.assertEqual(len(executor.log['error'].keys()), 1)
Example #12
0
    def test_job_list_api(self):
        # Create mock job.
        num_jobs = 5
        all_jobs = []
        for i in range(0, num_jobs):
            job = data_mocking.create_job(
                {
                    'name': 'my-test-job-{}'.format(i),
                    'project': self.project
                }, self.session)
            all_jobs.append(job)

        request_data = {
            'metadata': {
                'builder_or_trainer': {
                    'mode': 'builder'
                },
                'limit': 5,
                'project_string_id': self.project.project_string_id
            }
        }

        endpoint = "/api/v1/job/list"

        with self.client.session_transaction() as session:
            auth_api = common_actions.create_project_auth(project=self.project,
                                                          session=self.session)
            credentials = b64encode("{}:{}".format(
                auth_api.client_id,
                auth_api.client_secret).encode()).decode('utf-8')
            session['Authorization'] = credentials
            common_actions.add_auth_to_session(session, self.project.users[0])
        response = self.client.post(endpoint,
                                    data=json.dumps(request_data),
                                    headers={
                                        'directory_id':
                                        str(job.project.directory_default_id),
                                        'Authorization':
                                        'Basic {}'.format(credentials)
                                    })
        self.assertEqual(response.status_code, 200)
        new_session = sessionMaker.session_factory()
        self.assertEqual(len(response.json['Job_list']), num_jobs)
Example #13
0
    def test_job_pin_api(self):
        # Create mock job.
        job = data_mocking.create_job(
            {
                'name': 'my-test-job',
                'project': self.project
            }, self.session)

        request_data = {}

        endpoint = "/api/v1/job/{}/pin".format(job.id)

        with self.client.session_transaction() as session:
            auth_api = common_actions.create_project_auth(project=self.project,
                                                          session=self.session)
            credentials = b64encode("{}:{}".format(
                auth_api.client_id,
                auth_api.client_secret).encode()).decode('utf-8')
            session['Authorization'] = credentials
            common_actions.add_auth_to_session(session, self.project.users[0])
        response = self.client.post(endpoint,
                                    data=json.dumps(request_data),
                                    headers={
                                        'directory_id':
                                        str(job.project.directory_default_id),
                                        'Authorization':
                                        'Basic {}'.format(credentials)
                                    })
        data = response.json
        self.assertEqual(response.status_code, 200)
        self.assertEqual(data['job']['is_pinned'], True)

        response = self.client.post(endpoint,
                                    data=json.dumps(request_data),
                                    headers={
                                        'directory_id':
                                        str(job.project.directory_default_id),
                                        'Authorization':
                                        'Basic {}'.format(credentials)
                                    })
        data = response.json
        self.assertEqual(response.status_code, 200)
        self.assertEqual(data['job']['is_pinned'], False)
Example #14
0
 def test_sync_events_list_core(self):
     # Create mock tasks
     num_tasks = 5
     job = data_mocking.create_job(
         {
             'name': 'my-test-job-{}'.format(2),
             'project': self.project
         }, self.session)
     all_tasks = []
     for i in range(0, num_tasks):
         sync_event = data_mocking.create_sync_event(
             {
                 'description': 'syncevent{}'.format(i),
                 'job_id': job.id,
                 'project': self.project
             }, self.session)
         all_tasks.append(sync_event)
     self.session.commit()
     with self.app.test_request_context():
         common_actions.add_auth_to_session(flask.session,
                                            self.project.users[0])
         result = sync_events_list_core(
             self.session,
             date_from=None,
             date_to=None,
             status=None,
             job_id=job.id,
             dataset_source_id=None,
             dataset_destination_id=None,
             created_task_id=None,
             completed_task_id=None,
             event_effect_type=None,
             event_trigger_type=None,
             incoming_directory_id=None,
             project_string_id=self.project.project_string_id,
             limit=30,
             output_mode='serialize')
     logger.info(result)
     self.assertEqual(len(result), num_tasks)
Example #15
0
    def test_get_compare_op(self):
        query_string = 'labels.x > 5'  # dummy query
        with self.app.test_request_context():
            common_actions.add_auth_to_session(flask.session,
                                               self.project.users[0])
            query_creator = QueryCreator(session=self.session,
                                         project=self.project,
                                         member=self.member)
            diffgram_query_obj = query_creator.create_query(
                query_string=query_string)
            executor = SqlAlchemyQueryExecutor(
                session=self.session, diffgram_query=diffgram_query_obj)

            token = Token(value='>=', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.ge)

            token = Token(value='=', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.eq)

            token = Token(value='>=', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.ge)

            token = Token(value='<', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.lt)

            token = Token(value='<=', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.le)

            token = Token(value='!=', type_='dummy')
            op = executor.get_compare_op(token)
            self.assertEqual(op, operator.ne)
Example #16
0
 def test__determine_entity_type(self):
     token = Token(value='labels.apple', type_='dummy')
     token2 = Token(value='files.metadata', type_='dummy')
     token3 = Token(value='issues.count', type_='dummy')
     query_string = 'labels.x > 5'  # dummy query
     with self.app.test_request_context():
         common_actions.add_auth_to_session(flask.session,
                                            self.project.users[0])
         query_creator = QueryCreator(session=self.session,
                                      project=self.project,
                                      member=self.member)
         diffgram_query_obj = query_creator.create_query(
             query_string=query_string)
         executor = SqlAlchemyQueryExecutor(
             session=self.session, diffgram_query=diffgram_query_obj)
         e_type = executor._SqlAlchemyQueryExecutor__determine_entity_type(
             token)
     self.assertEqual(e_type, 'labels')
     e_type = executor._SqlAlchemyQueryExecutor__determine_entity_type(
         token2)
     self.assertEqual(e_type, 'files')
     e_type = executor._SqlAlchemyQueryExecutor__determine_entity_type(
         token3)
     self.assertEqual(e_type, 'issues')