def test_init_basic():
    p = Project(id="ABC1234",
                name="Hello World",
                created_at='2021-01-22T19:49:03.185Z')

    assert isinstance(p, APIResource)
    assert isinstance(p, Project)
    assert p.id == "ABC1234"
    assert p.name == "Hello World"
    assert p.created_at == datetime(2021,
                                    1,
                                    22,
                                    19,
                                    49,
                                    3,
                                    185000,
                                    tzinfo=tzutc())
def test_init_complete():
    response_json = {
        'fields_template':
        '<p><iframe src="{{video}}" width="560" height="315"></iframe><br></p>',
        'id':
        'A1B2C3-abcd-1234-wxyz-5823gd2238ac',
        'slug':
        'aJlz0Vr2ozdX',
        'name':
        'Identifying video results',
        'num_workers_per_task':
        3,
        'status':
        'paused',
        'created_at':
        '2021-01-22T19:49:03.185Z',
        'num_tasks_completed':
        176,
        'num_responses_completed':
        177,
        'instructions':
        '<p><b>Instructions: Categorize the following video.</b></p>',
        'num_tasks':
        177,
        'link_to_work_on_task':
        'https://app.surgehq.ai/workers/tasks?project_id=A1B2C3-abcd-1234-wxyz-5823gd2238ac',
        'avg_gold_standard_score':
        65.09,
        'interrater_agreement': {
            'What is this video?': 0.859154078549849
        },
        'private_workforce':
        False,
        'num_tasks_in_progress':
        0,
        'payment_per_response':
        0.12,
        'questions': [{
            'id':
            'c6ee667c-b260-415d-a200-f34250793b81',
            'text':
            'What is this video?',
            'required':
            True,
            'ner_allow_overlapping_tags':
            None,
            'ner_allow_relationship_tags':
            None,
            'preexisting_annotations':
            None,
            'type':
            'multiple_choice',
            'options': ['Option A', 'Option B', 'Option C'],
            'options_objects': [{
                'id': 'a1aex762-8b06-5xce-zd28-3fac8c4245b0',
                'text': 'Option A',
                'item_id': 'xyz123c-h260-415l-a999-g34250793b80',
                'created_at': '2021-01-22T19:53:04.552Z',
                'updated_at': '2021-01-22T19:53:04.552Z',
                'order': 1
            }, {
                'id': 'd77k9c91-9d9c-463c-87o7-b153eb89dfle',
                'text': 'Option B',
                'item_id': 'xyz123c-h260-415l-a999-g34250793b80',
                'created_at': '2021-01-22T19:53:04.557Z',
                'updated_at': '2021-01-22T19:53:04.557Z',
                'order': 2
            }, {
                'id': 'r79682ds-5cc4-4e54-8c6f-7ef06olo3c79',
                'text': 'Option C',
                'item_id': 'xyz123c-h260-415l-a999-g34250793b80',
                'created_at': '2021-01-22T19:53:04.560Z',
                'updated_at': '2021-01-22T19:53:04.560Z',
                'order': 3
            }]
        }]
    }

    p = Project(**response_json)

    assert isinstance(p, APIResource)
    assert isinstance(p, Project)
    assert p.id == "A1B2C3-abcd-1234-wxyz-5823gd2238ac"
    assert p.name == "Identifying video results"
    assert p.instructions == '<p><b>Instructions: Categorize the following video.</b></p>'
    assert p.num_workers_per_task == 3
    assert p.status == 'paused'
    assert p.num_tasks_completed == 176
    assert p.avg_gold_standard_score == 65.09
    assert p.interrater_agreement == {'What is this video?': 0.859154078549849}
    assert p.created_at == datetime(2021,
                                    1,
                                    22,
                                    19,
                                    49,
                                    3,
                                    185000,
                                    tzinfo=tzutc())
    assert type(p.questions) == list
    for q in p.questions:
        assert isinstance(q, Question)
        assert isinstance(q, MultipleChoiceQuestion)
        assert type(q.options) == list
def test_convert_questions_to_objects():
    questions_data = [{
        'id':
        'cd3efdb7-3cf2-4558-b443-486fd09b4cc6',
        'text':
        'Checkbox for {{url}}',
        'required':
        True,
        'ner_allow_overlapping_tags':
        None,
        'ner_allow_relationship_tags':
        None,
        'preexisting_annotations':
        None,
        'type':
        'checkbox',
        'options': ['Option 1', 'Option 2'],
        'options_objects': [{
            'id': 'f3c69282-93dd-496e-aeba-4768f5eea658',
            'text': 'Option 1',
            'item_id': 'cd3efdb7-3cf2-4558-b443-486fd09b4cc6',
            'created_at': '2021-02-20T20:56:34.540Z',
            'updated_at': '2021-02-20T20:56:34.540Z',
            'order': 1
        }, {
            'id': '0dffdc42-4abe-4b39-99b3-4b3bcfda5b55',
            'text': 'Option 2',
            'item_id': 'cd3efdb7-3cf2-4558-b443-486fd09b4cc6',
            'created_at': '2021-02-20T20:56:34.543Z',
            'updated_at': '2021-02-20T20:56:34.543Z',
            'order': 2
        }]
    }, {
        'id':
        'c4b0d6a9-f735-40c1-9b42-0414945ef2db',
        'text':
        'Multiple choice for {{url}}',
        'required':
        False,
        'ner_allow_overlapping_tags':
        None,
        'ner_allow_relationship_tags':
        None,
        'preexisting_annotations':
        None,
        'type':
        'multiple_choice',
        'options': ['Choice 1', 'Choice 2'],
        'options_objects': [{
            'id': '92ca3805-efdd-4740-b0a6-bf35997be321',
            'text': 'Choice 1',
            'item_id': 'c4b0d6a9-f735-40c1-9b42-0414945ef2db',
            'created_at': '2021-02-20T20:56:34.549Z',
            'updated_at': '2021-02-20T20:56:34.549Z',
            'order': 1
        }, {
            'id': '44756518-06db-4774-a4b9-32ffc33351b6',
            'text': 'Choice 2',
            'item_id': 'c4b0d6a9-f735-40c1-9b42-0414945ef2db',
            'created_at': '2021-02-20T20:56:34.551Z',
            'updated_at': '2021-02-20T20:56:34.551Z',
            'order': 2
        }]
    }, {
        'id': '6123463e-349e-4450-80d2-6684a28755b3',
        'text': 'Free response for {{url}}',
        'required': False,
        'ner_allow_overlapping_tags': None,
        'ner_allow_relationship_tags': None,
        'preexisting_annotations': None,
        'type': 'free_response',
        'options': [],
        'options_objects': []
    }, {
        'id':
        'c46e2714-9bf6-44a8-aac3-f01f9fec8ae2',
        'text':
        'This is a Named Entity Recognition prompt for {{url}}',
        'required':
        False,
        'ner_allow_overlapping_tags':
        None,
        'ner_allow_relationship_tags':
        None,
        'preexisting_annotations':
        None,
        'type':
        'text_tagging',
        'options': ['Label 1', 'Label 2', 'Label 3'],
        'options_objects': [{
            'id': '6a434174-09ee-48c3-8490-149ac4554132',
            'text': 'Label 1',
            'item_id': 'c46e2714-9bf6-44a8-aac3-f01f9fec8ae2',
            'created_at': '2021-02-20T20:56:34.569Z',
            'updated_at': '2021-02-20T20:56:34.569Z',
            'order': 1
        }, {
            'id': '3747d91a-79a9-4227-8daf-32384d4f1b4f',
            'text': 'Label 2',
            'item_id': 'c46e2714-9bf6-44a8-aac3-f01f9fec8ae2',
            'created_at': '2021-02-20T20:56:34.572Z',
            'updated_at': '2021-02-20T20:56:34.572Z',
            'order': 2
        }, {
            'id': '46f3cf0d-687e-4a44-a436-47681b64f7d5',
            'text': 'Label 3',
            'item_id': 'c46e2714-9bf6-44a8-aac3-f01f9fec8ae2',
            'created_at': '2021-02-20T20:56:34.575Z',
            'updated_at': '2021-02-20T20:56:34.575Z',
            'order': 3
        }]
    }]

    project = Project(id="ABC1234", name="Hello World")
    questions = project._convert_questions_to_objects(questions_data)
    assert type(questions) == list
    assert len(questions) == 4

    assert type(questions[0]) == CheckboxQuestion
    assert questions[0].text == 'Checkbox for {{url}}'
    assert questions[0].required == True
    assert questions[0].options

    assert type(questions[1]) == MultipleChoiceQuestion
    assert questions[1].text == 'Multiple choice for {{url}}'
    assert questions[1].required == False
    assert questions[1].options

    assert type(questions[2]) == FreeResponseQuestion
    assert questions[2].text == 'Free response for {{url}}'
    assert questions[2].required == False
    assert not hasattr(questions[2], "options")

    assert type(questions[3]) == TextTaggingQuestion
    assert questions[
        3].text == 'This is a Named Entity Recognition prompt for {{url}}'
    assert questions[3].required == False
    assert questions[3].options
def test_str():
    p_str = str(
        Project(id="ABC1234",
                name="Hello World",
                created_at='2021-01-22T19:49:03.185Z'))
    assert p_str == '<surge.Project#ABC1234 name="Hello World">'
def test_raise_exception_if_missing_name():
    with pytest.raises(SurgeMissingAttributeError) as e_info:
        p = Project(id="123ABCD")
def test_repr():
    attr = repr(
        Project(id="ABC1234",
                name="Hello World",
                created_at='2021-01-22T19:49:03.185Z'))
    assert attr == '<surge.Project#ABC1234 name="Hello World" created_at="2021-01-22 19:49:03.185000+00:00">'
def test_print_attrs():
    attr = Project(id="ABC1234",
                   name="Hello World",
                   created_at='2021-01-22T19:49:03.185Z').print_attrs()
    assert attr == 'id="ABC1234" name="Hello World" created_at="2021-01-22 19:49:03.185000+00:00"'
def test_raise_exception_if_missing_id():
    with pytest.raises(SurgeMissingIDError) as e_info:
        p = Project(name="Test")