def test_pull_task(self):
        task1 = Task()
        task1.uuid = 'de305d54-75b4-431b-adb2-eb6b9e546018'
        task1.test_id = 'de305d54-75b4-431b-adb2-eb6b9e546018'
        task1.claimed = datetime.utcnow()
        task1.data = json.dumps({'wait_time': 123})
        db.session.add(task1)

        task2 = Task()
        task2.uuid = 'de305d54-75b4-431b-adb2-eb6b9e546019'
        task2.test_id = 'de305d54-75b4-431b-adb2-eb6b9e546019'
        task2.claimed = datetime.utcnow()
        task2.completed = datetime.utcnow()
        task2.result_data = json.dumps({'result': 'epic success'})
        db.session.add(task2)

        task3 = Task()
        task3.uuid = 'de305d54-75b4-431b-adb2-eb6b9e546020'
        task3.test_id = 'de305d54-75b4-431b-adb2-eb6b9e546020'
        task3.claimed = datetime.utcnow()
        task3.failed = datetime.utcnow()
        task3.error = 'unknown error'
        db.session.add(task3)

        db.session.commit()

        self.test_app.get('/task/de305d54-75b4-431b-adb2-eb6b9e546018')
        self.test_app.get('/task/de305d54-75b4-431b-adb2-eb6b9e546019')
        self.test_app.get('/task/de305d54-75b4-431b-adb2-eb6b9e546020')
    def test_poll_tasks_claim_one(self):
        """Test if task is correctly claimed."""

        task = Task()
        task.uuid = 'de305d54-75b4-431b-adb2-eb6b9e546013'
        task.test_id = 'de305d54-75b4-431b-adb2-eb6b9e546013'
        task.type = 'task-type-1'
        task.version = 1
        task.data = "{}"
        db.session.add(task)
        db.session.commit()

        resp = self.test_app.post_json('/tasks', {
            'protocol': 1,
            'agent_id': 'de305d54-75b4-431b-adb2-eb6b9e546013',
            'agent_name': 'Agent 007',
            'agent_location': {
                'country': 'FI',
                'region': '18'
            },
            'agent_time': '2012-04-23T18:25:43.511Z',
            'agent_capabilities': {
                'task-type-1': {'version': 1},
                'task-type-2': {'version': 2}
            },
            'max_tasks': 5
        })
        jsonschema.validate(resp.json, TestPolling.task_request_response_schema)
        self.assertEqual(len(resp.json['tasks']), 1)
    def test_post_task_duplicate(self):
        task1 = Task()
        task1.uuid = 'de305d54-75b4-431b-adb2-eb6b9e546018'
        task1.test_id = 'de305d54-75b4-431b-adb2-eb6b9e546018'
        task1.claimed = datetime.utcnow()
        task1.data = json.dumps({'wait_time': 123})
        db.session.add(task1)
        db.session.commit()
        db.session.close()

        assert self.test_app.post_json('/task', {
            'task_id': 'de305d54-75b4-431b-adb2-eb6b9e546018',
            'test_id': 'de305d54-75b4-431b-adb2-eb6b9e546013',
            'task_type': 'wait',
            'task_version': 1
        }, expect_errors=True).status_int == 400
def post_task():
    data = request.json

    if data is None:
        abort(400)

    try:
        jsonschema.validate(data, POST_TASK_SCHEMA)
    except jsonschema.ValidationError:
        abort(400)

    task_uuid = str(data['task_id'])
    task_type = str(data['task_type'])
    task_test_id = (data['test_id'])
    task_data = ""

    task = Task(uuid=task_uuid,
                type=task_type,
                version=int(data['task_version']),
                test_id=task_test_id)

    if 'task_data' in data:
        task_data = json.dumps(data['task_data'])
        task.data = task_data

    try:
        db.session.add(task)
    except IntegrityError:
        db.session.rollback()
        abort(400)

    try:
        db.session.commit()
    except (IntegrityError, ProgrammingError):
        db.session.rollback()
        current_app.logger.error(
            "Failed to commit database changes for BPMS task POST")
        abort(400)

    current_app.logger.info(
        "Task posted by BPMS - Task's type: {}, test process id: {}, uuid: {}, parameters: {}"
        .format(task_type, task_test_id, task_uuid, task_data))

    return ('', 200)
def post_task():
    data = request.json

    if data is None:
        abort(400)

    try:
        jsonschema.validate(data, POST_TASK_SCHEMA)
    except jsonschema.ValidationError:
        abort(400)

    task_uuid = str(data['task_id'])
    task_type = str(data['task_type'])
    task_test_id = (data['test_id'])
    task_data = ""

    task = Task(
        uuid=task_uuid,
        type=task_type,
        version=int(data['task_version']),
        test_id=task_test_id
    )

    if 'task_data' in data:
        task_data = json.dumps(data['task_data'])
        task.data = task_data

    try:
        db.session.add(task)
    except IntegrityError:
        db.session.rollback()
        abort(400)

    try:
        db.session.commit()
    except (IntegrityError, ProgrammingError):
        db.session.rollback()
        current_app.logger.error("Failed to commit database changes for BPMS task POST")
        abort(400)

    current_app.logger.info("Task posted by BPMS - Task's type: {}, test process id: {}, uuid: {}, parameters: {}"
                            .format(task_type, task_test_id, task_uuid, task_data))

    return ('', 200)