Beispiel #1
0
def test_constraint():
    """Test Constraint."""
    c1 = Constraint("author", ConstraintType("==", "Stephen King"))
    c2 = Constraint("author", ConstraintType("in", ["Stephen King"]))
    book_1 = Description({
        "author": "Stephen King",
        "year": 1991,
        "genre": "horror"
    })
    book_2 = Description({
        "author": "George Orwell",
        "year": 1948,
        "genre": "horror"
    })
    assert c1.check(book_1)
    assert not c1.check(book_2)

    # empty description
    assert not c1.check(Description({}))

    # bad type
    assert not c1.check(Description({"author": 12}))

    # bad type
    assert not c2.check(Description({"author": 12}))

    assert c1.is_valid(generate_data_model("test", {"author": "some author"}))

    assert not c1.is_valid(
        generate_data_model("test", {"not_author": "some author"}))

    assert c1 == c1
    assert c1 != c2
Beispiel #2
0
def test_query():
    """Test Query."""
    c1 = Constraint("author", ConstraintType("==", "Stephen King"))
    query = Query([c1])
    query.check_validity()
    assert query.check(
        Description({"author": "Stephen King", "year": 1991, "genre": "horror"})
    )
    assert query.is_valid(generate_data_model("test", {"author": "some author"}))

    with pytest.raises(ValueError, match=r"Constraints must be a list .*"):
        query = Query(c1)

    Query([]).check_validity()

    with pytest.raises(
        ValueError,
        match=r"Invalid input value for type 'Query': the query is not valid for the given data model.",
    ):
        Query(
            [c1], generate_data_model("test", {"notauthor": "not some author"})
        ).check_validity()

    assert Query([]) == Query([])

    mock = Mock()
    Query.encode(mock, Query([]))
    assert Query.decode(mock) == Query([])
Beispiel #3
0
def test_query():
    """Test Query."""
    c1 = Constraint("author", ConstraintType("==", "Stephen King"))
    model = generate_data_model("book_author",
                                {"author": "author of the book"})
    query = Query([c1], model=model)

    assert query.check(
        Description({
            "author": "Stephen King",
            "year": 1991,
            "genre": "horror"
        }))
    assert query.is_valid(
        generate_data_model("test", {"author": "some author"}))

    query.check_validity()
    with pytest.raises(ValueError, match=r"Constraints must be a list .*"):
        query = Query(c1)
    Query([]).check_validity()
    with pytest.raises(
            ValueError,
            match=
            r"Invalid input value for type 'Query': the query is not valid for the given data model.",
    ):
        Query([c1],
              generate_data_model(
                  "test", {"notauthor": "not some author"})).check_validity()

    assert query == Query([c1],
                          model=generate_data_model(
                              "book_author", {"author": "author of the book"}))

    assert (
        str(query) ==
        f"Query(constraints=['Constraint(attribute_name=author,constraint_type=ConstraintType(value=Stephen King,type===))'],model={model})"
    )

    query_pb = query._encode()
    actual_query = Query._decode(query_pb)
    assert actual_query == query

    query_pb = MagicMock()
    query_pb.query_bytes = None
    Query.encode(query_pb, query)
    assert query_pb.query_bytes is not None
    query = Query.decode(query_pb)
    assert "author" in query.model.attributes_by_name
Beispiel #4
0
def test_generate_data_model():
    """Test model generated from description."""
    params = dict(name="test", type_=str, is_required=True)

    data_model = DataModel("test", [Attribute(**params)])

    assert generate_data_model("test", {"test": "str"}) == data_model
Beispiel #5
0
def test_description():
    """Test model description."""
    values = {"test": "test"}
    Description(values=values, data_model=generate_data_model("test", values))
    desc = Description(values=values)
    assert (
        str(desc) ==
        "Description(values={'test': 'test'},data_model=DataModel(name=,attributes={'test': \"Attribute(name=test,type=<class 'str'>,is_required=True)\"},description=))"
    )

    assert Description(values=values) == Description(values=values)
    assert list(Description(values=values)) == list(values.values())

    with pytest.raises(AttributeInconsistencyException,
                       match=r"Missing required attribute."):
        Description(values=values,
                    data_model=generate_data_model("test",
                                                   {"extra_key": "key"}))

    with pytest.raises(
            AttributeInconsistencyException,
            match=r"Have extra attribute not in data model.",
    ):
        Description(values=values, data_model=generate_data_model("test", {}))

    with pytest.raises(AttributeInconsistencyException,
                       match=r".* has incorrect type:.*"):
        Description(values=values,
                    data_model=generate_data_model("test", {"test": 12}))

    with pytest.raises(AttributeInconsistencyException,
                       match=r".* has unallowed type:.*"):
        Description(
            values={"test": object()},
            data_model=generate_data_model("test", {"test": object()}),
        )

    desc = Description(values=values)
    mock = Mock()
    Description.encode(mock, desc)
    assert Description.decode(mock) == desc
Beispiel #6
0
def test_description():
    """Test model description."""
    values = {"test": "test"}
    Description(values=values, data_model=generate_data_model("test", values))
    Description(values=values)

    assert Description(values=values) == Description(values=values)
    assert list(Description(values=values)) == list(values.values())

    with pytest.raises(
        AttributeInconsistencyException, match=r"Missing required attribute."
    ):
        Description(
            values=values, data_model=generate_data_model("test", {"extra_key": "key"})
        )

    with pytest.raises(
        AttributeInconsistencyException,
        match=r"Have extra attribute not in data model.",
    ):
        Description(values=values, data_model=generate_data_model("test", {}))

    with pytest.raises(
        AttributeInconsistencyException, match=r".* has incorrect type:.*"
    ):
        Description(values=values, data_model=generate_data_model("test", {"test": 12}))

    with pytest.raises(
        AttributeInconsistencyException, match=r".* has unallowed type:.*"
    ):
        Description(
            values={"test": object()},
            data_model=generate_data_model("test", {"test": object()}),
        )

    desc = Description(values=values)
    mock = Mock()
    Description.encode(mock, desc)
    assert Description.decode(mock) == desc
Beispiel #7
0
def test_description():
    """Test model description."""
    values = {
        "test": "test_value",
        "bool": True,
        "float": 1.1,
        "int": int(1),
        "loc": Location(1, 1),
    }
    description = Description(values=values,
                              data_model=generate_data_model("test", values))

    assert description.values == values
    assert description == Description(values=values,
                                      data_model=generate_data_model(
                                          "test", values))
    assert list(description.values.values()) == list(values.values())
    assert list(description) == list(values)

    with pytest.raises(AttributeInconsistencyException,
                       match=r"Missing required attribute."):
        Description(values=values,
                    data_model=generate_data_model("test",
                                                   {"extra_key": "key"}))
    with pytest.raises(
            AttributeInconsistencyException,
            match=r"Have extra attribute not in data model.",
    ):
        Description(values=values, data_model=generate_data_model("test", {}))
    with pytest.raises(AttributeInconsistencyException,
                       match=r".* has incorrect type:.*"):
        Description(
            values=values,
            data_model=generate_data_model("test", {
                **values, "test": 12
            }),
        )

    with pytest.raises(AttributeInconsistencyException,
                       match=r".* has unallowed type:.*"):
        Description(
            values={"test": object()},
            data_model=generate_data_model("test", {"test": object()}),
        )

    assert re.match(r"Description\(values=.*data_model=.*", str(description))

    description_pb = description._encode()
    actual_description = Description._decode(description_pb)
    assert actual_description == description

    mock = MagicMock()
    mock.description_bytes = None
    Description.encode(mock, description)
    assert mock.description_bytes is not None
    description = Description.decode(mock)
    assert "test" in description.values
Beispiel #8
0
def test_constraint():
    """Test Constraint."""
    c1 = Constraint("author", ConstraintType("==", "Stephen King"))
    c2 = Constraint("year", ConstraintType("within", (2000, 2010)))
    c3 = Constraint("author",
                    ConstraintType("in", ("Stephen King", "J. K. Rowling")))
    c4 = Constraint(
        "author", ConstraintType("not_in", ("Stephen King", "J. K. Rowling")))
    c5 = Constraint("address",
                    ConstraintType("distance", (Location(1.1, 2.2), 2.2)))

    book_1 = Description({
        "author": "Stephen King",
        "year": 2005,
        "address": Location(1.1, 2.2)
    })
    book_2 = Description({
        "author": "George Orwell",
        "year": 1948,
        "address": Location(1.1, 2.2)
    })

    assert c1.check(book_1)
    assert not c1.check(book_2)
    # empty description
    assert not c1.check(Description({}))
    # bad type
    assert not c1.check(Description({"author": 12}))
    # bad type
    assert not c2.check(Description({"author": 12}))

    assert c1.is_valid(generate_data_model("test", {"author": "some author"}))
    assert not c1.is_valid(
        generate_data_model("test", {"not_author": "some author"}))

    assert c1 == c1
    assert c1 != c2

    assert (
        str(c1) ==
        f"Constraint(attribute_name=author,constraint_type={c1.constraint_type})"
    )
    assert (
        str(c2) ==
        f"Constraint(attribute_name=year,constraint_type={c2.constraint_type})"
    )

    c1_pb = c1.encode()
    actual_c1 = Constraint.decode(c1_pb)
    assert actual_c1 == c1

    c2_pb = c2.encode()
    actual_c2 = Constraint.decode(c2_pb)
    assert actual_c2 == c2

    c3_pb = c3.encode()
    actual_c3 = Constraint.decode(c3_pb)
    assert actual_c3 == c3

    c4_pb = c4.encode()
    actual_c4 = Constraint.decode(c4_pb)
    assert actual_c4 == c4

    c5_pb = c5.encode()
    actual_c5 = Constraint.decode(c5_pb)
    assert actual_c5 == c5