Beispiel #1
0
def test_json_transform_to_model(session, raw_data, transformer, mock_logger):
    timestamp_submission = utc_now()
    with freeze_time(timestamp_submission):
        form = factories.FormFactory(schema=raw_data.schema)
        submission = factories.SubmissionFactory(form=form,
                                                 responses=raw_data.responses)
        session.add_all([form, submission])
        session.flush()

    timestamp_transformation = utc_now()
    with freeze_time(timestamp_transformation):
        # TODO remove explicit processed_on to verify default
        results = transformer([submission],
                              processed_on=timestamp_transformation)

    assert results
    assert isinstance(results, types.GeneratorType)

    results = list(results)
    assert len(results) == len(raw_data.events)

    # verify all standard fields
    for actual_event in results:
        assert isinstance(actual_event, models.ResponseEvent)
        assert actual_event.form_id == form.id
        assert actual_event.form_name == form.name

        assert actual_event.user_id == submission.user.id
        assert actual_event.user_full_name == submission.user.full_name

        assert actual_event.submission_id == submission.id
        assert actual_event.submission_created == timestamp_submission

        assert actual_event.processed_on == timestamp_transformation

    # convert results to a dictionary of only the data we care about
    sorted_actual_events = sorted(({
        'schema_path': e.schema_path,
        'value': e.value,
        'answer_type': e.answer_type.name,
        'tag': None if not e.tag else e.tag
    } for e in results),
                                  key=lambda e: e['schema_path'])
    assert sorted_actual_events == raw_data.events

    _verify_logged_metrics(mock_logger, 1)
Beispiel #2
0
def test_json_transform_to_dict(session, raw_data, transformer):
    timestamp_submission = utc_now()
    with freeze_time(timestamp_submission):
        form = factories.FormFactory(schema=raw_data.schema)
        submission = factories.SubmissionFactory(form=form,
                                                 responses=raw_data.responses)
        session.add_all([form, submission])
        session.flush()

    timestamp_transformation = utc_now()
    with freeze_time(timestamp_transformation):
        # TODO remove explicit processed_on to verify default
        results = transformer([submission],
                              processed_on=timestamp_transformation,
                              to_dict=True)

    assert results
    assert isinstance(results, types.GeneratorType)

    results = list(results)
    assert len(results) == len(raw_data.events)

    # verify all standard fields
    for actual_event in results:
        assert isinstance(actual_event, dict)
        assert actual_event['form_id'] == form.id
        assert actual_event['form_name'] == form.name

        assert actual_event['user_id'] == submission.user.id
        assert actual_event['user_full_name'] == submission.user.full_name

        assert actual_event['submission_id'] == submission.id
        assert actual_event['submission_created'] == timestamp_submission

        assert actual_event['processed_on'] == timestamp_transformation

    sorted_actual_events = sorted(({
        'schema_path': e['schema_path'],
        'value': e['value'],
        'answer_type': e['answer_type'],
        'tag': None if not e['tag'] else e['tag']
    } for e in results),
                                  key=lambda e: e['schema_path'])
    assert sorted_actual_events == raw_data.events
Beispiel #3
0
def test_submission_answer_type(session, simple_form, user, variant_answer):
    event = models.ResponseEvent(
        form_id=simple_form.id,
        form_name=simple_form.name,
        user_id=user.id,
        user_full_name=user.full_name,
        submission_id=uuid.uuid4(),
        submission_created=utc_now(),
        processed_on=utc_now(),
        schema_path='test.path',
        value=variant_answer['value'],
        answer_type=variant_answer['answer_type']
    )
    session.add(event)
    session.flush()

    serialized_event = session.query(models.ResponseEvent).get(event.id)
    assert serialized_event
    assert serialized_event.answer_type == variant_answer['answer_type']
    assert serialized_event.value == variant_answer['value']
Beispiel #4
0
def test_submission_timestamp(session, simple_form, user):
    now = utc_now()
    with freeze_time(now):
        submission = factories.SubmissionFactory(form=simple_form, user=user, responses={})
        session.add(submission)
        session.flush()

    results = session.query(models.Submission).all()
    assert len(results) == 1

    actual_submission = results[0]
    assert actual_submission.form == simple_form
    assert actual_submission.user == user
    assert actual_submission.date_created == now
    assert actual_submission.responses == {}
Beispiel #5
0
def transform_submissions(session,
                          submissions,
                          processed_on: datetime.datetime = None,
                          to_dict=False):
    """
    Transforms Submissions into ResponseEvents

    :param session: SQLAlchemy session
    :param submissions: submissions generator
    :param processed_on: optional timestamp to apply to 'processed_on' column of all ResponseEvents
    :return: generator of ResponseEvents
    """
    processed_on = processed_on or utc_now()
    get_node_path_map = get_node_path_map_cache(session)
    num_submissions = 0
    for submission in submissions:
        yield from _transform_submission(get_node_path_map, submission,
                                         processed_on, to_dict)
        num_submissions += 1
    LOGGER.info('Transformed %d JSON submissions', num_submissions)
Beispiel #6
0
from app.util.timestamps import utc_now
from freezegun import freeze_time


number = 1
text = 2
boolean = 3
date = 4


@pytest.fixture(
    params=[
        (constants.AnswerType.number, 5),
        (constants.AnswerType.text, 'hello, world!'),
        (constants.AnswerType.boolean, True,),
        (constants.AnswerType.date, utc_now().date())
    ],
    ids=[
        'number',
        'text',
        'boolean',
        'date'
    ]
)
def variant_answer(request):
    return {
        'answer_type': request.param[0],
        'value': str(request.param[1])
    }