Exemple #1
0
def test_nullable_array_of_strings():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "array_of_strings":
            prop.Array(
                repeated_structure=prop.String("just a list of strings"),
                description="A description of what this array contains",
                required=True,
                nullable=False)
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "array_of_strings": None
    }

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "Non nullable field 'array_of_strings' is null!"
Exemple #2
0
def test_nested_required_field():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "object":
            prop.Object(
                structure={
                    "sub_string": prop.String("the string", required=False),
                    "required_string": prop.String(required=True)
                })
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "object": {
            "sub_string": "hello",
        },
    }

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "The field 'required_string' is required but not found in the body!"
Exemple #3
0
def test_no_defined_schema():
    output_schema = {
        HTTPStatus.BAD_REQUEST: {
            "basic_string":
            prop.String("Description", required=True, nullable=True),
        }
    }

    result = HTTPStatus.OK, {}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "Endpoint does not define http status code 200 in the output schema!"
Exemple #4
0
def test_output_of_wrong_type():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string": prop.String(),
        }
    }

    result = HTTPStatus.OK, {"basic_string": 80.99}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "The value 80.99 from field 'basic_string' is the wrong type, expected: String"
Exemple #5
0
def test_output_number_string():

    output_schema = {
        HTTPStatus.OK: {
            "basic_number": prop.Number(),
        }
    }

    result = HTTPStatus.OK, {"basic_number": "80.99"}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "The value '80.99' from field 'basic_number' is the wrong type, expected: Number"
Exemple #6
0
def test_required_false_nullable_false_is_present_not_none_there_and_null():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String("Description", required=False, nullable=False),
        }
    }

    result = HTTPStatus.OK, {"basic_string": None}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "Non nullable field 'basic_string' is null!"
Exemple #7
0
def test_required_true_nullable_true_not_present():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String("Description", required=True, nullable=True),
        }
    }

    result = HTTPStatus.OK, {}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "The field 'basic_string' is required but not found in the body!"
Exemple #8
0
def test_create_output_array_of_strings():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "array_of_strings":
            prop.Array(
                repeated_structure=prop.String("just a list of strings"),
                description="A description of what this array contains")
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "array_of_strings": ["hello", "hello again"]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True,
        "array_of_strings": ["hello", "hello again"]
    }
Exemple #9
0
def test_create_output_identical_dict():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string": prop.String(),
            "basic_boolean": prop.Boolean(),
            "sub_dict": prop.Object(structure={"sub_string": prop.String()})
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello",
        }
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200

    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello"
        }
    }
Exemple #10
0
def test_specializer_object():

    output_schema = {HTTPStatus.OK: SimpleFields().all()}

    result = HTTPStatus.OK, {"message": "hello"}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {"message": "hello"}
Exemple #11
0
def test_arrow_date():
    output_schema = {
        HTTPStatus.OK: {
            "arrow_date": prop.DateTime(),
        }
    }

    result = HTTPStatus.OK, {"arrow_date": arrow.get(2020, 7, 1)}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {"arrow_date": "2020-07-01T00:00:00+00:00"}
Exemple #12
0
def test_none_date_not_in_a_string():
    output_schema = {
        HTTPStatus.OK: {
            "arrow_date": prop.DateTime(required=False, nullable=True),
        }
    }

    result = HTTPStatus.OK, {"arrow_date": None}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {}
Exemple #13
0
def test_none_enum():
    output_schema = {
        HTTPStatus.OK: {
            "enum": prop.Enum(required=False, nullable=True),
        }
    }

    result = HTTPStatus.OK, {"enum": None}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {}
Exemple #14
0
def test_output_numeric_string():

    output_schema = {
        HTTPStatus.OK: {
            "basic_number": prop.Numeric(),
        }
    }

    result = HTTPStatus.OK, {"basic_number": "80.99"}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {"basic_number": "80.99"}
Exemple #15
0
def test_very_nested_nullable_field():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "array_of_objects":
            prop.Array(repeated_structure=prop.Object(
                structure={
                    "sub_string":
                    prop.String("the string", required=True, nullable=False),
                    "required_one":
                    prop.String(required=True, nullable=False)
                }),
                       description="A list of plans.")
        }
    }

    result = HTTPStatus.OK, {
        "basic_string":
        "test string",
        "basic_boolean":
        True,
        "array_of_objects": [{
            "sub_string": None,
            "required_one": "here"
        }, {
            "sub_string": "hello",
            "required_one": "here_too"
        }]
    }

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == "Non nullable field 'sub_string' is null!"
Exemple #16
0
def test_required_false_nullable_true_is_present_not_none_not_there():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String("Description", required=False, nullable=True),
        }
    }

    result = HTTPStatus.OK, {}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {}
Exemple #17
0
def test_one_of_invalid():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop_wrapper.OneOf([
                prop.String(validators=[validators.ExactLength(2)]),
                prop.Boolean()
            ])
        }
    }

    result = HTTPStatus.OK, {"basic_string": "asdf"}

    with pytest.raises(prop.ValidationError) as e:
        create_output(result, output_schema)

    assert e.value.message == (
        "The value 'asdf' from field 'basic_string' is not "
        "valid for one of the defined props for the following "
        "reasons: String is not the correct length! The string "
        "'asdf' is 4 characters long, not 2!, The value 'asdf' "
        "from field 'basic_string' is the wrong type, expected: Boolean")
Exemple #18
0
def test_one_of():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string": prop_wrapper.OneOf([prop.String(),
                                                prop.Boolean()])
        }
    }

    result = HTTPStatus.OK, {"basic_string": "asdf"}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {"basic_string": "asdf"}
Exemple #19
0
def test_nested_specializer_object_with_results_structure_and_specialize():

    output_schema = {
        HTTPStatus.OK: {
            "results":
            prop.Array(repeated_structure=prop.Object(
                structure=NestedFields().specialize(only=["top_level_id"]),
                description="A basic field object"))
        }
    }

    result = HTTPStatus.OK, {
        "results": [
            {
                "top_level_id": 31,
                "don_t_return_me": "super secret data"
            },
            {
                "top_level_id": 32
            },
            {
                "top_level_id": 33
            },
            {
                "top_level_id": 34,
                "don_t_return_me": "even more secret data"
            },
        ]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "results": [
            {
                "top_level_id": 31
            },
            {
                "top_level_id": 32
            },
            {
                "top_level_id": 33
            },
            {
                "top_level_id": 34
            },
        ]
    }
Exemple #20
0
def test_triple_nested_dicts():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "sub_dict":
            prop.Object(structure={
                "sub_string":
                prop.String("the string"),
                "sub_sub_dict":
                prop.Object(structure={"boo": prop.Boolean()})
            },
                        description="A list of plans.")
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello",
            "not_this": "Not this",
            "sub_sub_dict": {
                "boo": False,
                "why_is_this_here": "ignore"
            }
        }
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200

    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello",
            "sub_sub_dict": {
                "boo": False
            }
        }
    }
Exemple #21
0
def test_nested_specializer_object_with_results_array_of_strings():

    output_schema = {
        HTTPStatus.OK: {
            "results":
            prop.Array(repeated_structure=prop.String(
                "this is an array of strings", required=True, nullable=False))
        }
    }

    result = HTTPStatus.OK, {
        "results": ["perfectly", "valid", "array", "of", "strings"]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "results": ["perfectly", "valid", "array", "of", "strings"]
    }
Exemple #22
0
def test_multiple_outputs():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string": prop.String(),
            "basic_boolean": prop.Boolean()
        },
        HTTPStatus.BAD_REQUEST: {
            "message": prop.String("Nope")
        }
    }

    result = HTTPStatus.BAD_REQUEST, {"message": "Oh man"}

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 400
    assert returned_dict == {
        "message": "Oh man",
    }
Exemple #23
0
def test_create_output_array_of_objects():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "array_of_objects":
            prop.Array(repeated_structure=prop.Object(
                structure={"sub_string": prop.String("the string")}),
                       description="A list of plans.")
        }
    }

    result = HTTPStatus.OK, {
        "basic_string":
        "test string",
        "basic_boolean":
        True,
        "array_of_objects": [{
            "sub_string": "hello",
            "not_this": "not this"
        }, {
            "sub_string": "hello",
            "not_this": "still not this",
            "another_one": "???"
        }]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200

    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True,
        "array_of_objects": [{
            "sub_string": "hello",
        }, {
            "sub_string": "hello",
        }]
    }
Exemple #24
0
def test_create_output():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string": prop.String(),
            "basic_boolean": prop.Boolean()
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "secret_info": "secret info"
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True
    }
Exemple #25
0
def test_nested_specializer_object():

    output_schema = {HTTPStatus.OK: NestedFields().all()}

    result = HTTPStatus.OK, {
        "top_level_id":
        34,
        "top_level_array": [{
            "nested_id":
            45,
            "nested_array": [{
                "super_nested_id": 56,
                "another_number": 23
            }, {
                "super_nested_id": 57,
                "another_number": 23
            }]
        }]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "top_level_id":
        34,
        "top_level_array": [{
            "nested_id":
            45,
            "nested_array": [{
                "super_nested_id": 56,
                "another_number": 23
            }, {
                "super_nested_id": 57,
                "another_number": 23
            }]
        }]
    }
Exemple #26
0
def test_create_output_different_dict():

    output_schema = {
        HTTPStatus.OK: {
            "basic_string":
            prop.String(),
            "basic_boolean":
            prop.Boolean(),
            "sub_dict":
            prop.Object(
                structure={"sub_string": prop.String()},
                description="This is a fake object nested in a dictionary",
                required=True,
                nullable=False)
        }
    }

    result = HTTPStatus.OK, {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello",
            "not_this": "Not this"
        }
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200

    assert returned_dict == {
        "basic_string": "test string",
        "basic_boolean": True,
        "sub_dict": {
            "sub_string": "hello"
        }
    }
Exemple #27
0
def test_nested_specializer_object_with_results_structure():

    output_schema = {
        HTTPStatus.OK: {
            "results":
            prop.Array(repeated_structure=prop.Object(
                structure=SimpleFields().all(),
                description="A basic field object"))
        }
    }

    result = HTTPStatus.OK, {
        "results": [{
            "message": "hello"
        }, {
            "message": "hello"
        }, {
            "message": "hello"
        }, {
            "message": "hello"
        }]
    }

    http_status_code, returned_dict = create_output(result, output_schema)
    assert http_status_code == 200
    assert returned_dict == {
        "results": [{
            "message": "hello"
        }, {
            "message": "hello"
        }, {
            "message": "hello"
        }, {
            "message": "hello"
        }]
    }