|
15 | 15 | import yaml |
16 | 16 | import pytest |
17 | 17 |
|
18 | | -from typing import (TypeVar) |
19 | | -from collections import namedtuple |
| 18 | +from typing import (TypeVar, Sequence) |
| 19 | +from collections import (OrderedDict, namedtuple) |
20 | 20 | from google.protobuf import descriptor_pb2 |
21 | 21 |
|
22 | 22 | import gapic.samplegen.samplegen as samplegen |
23 | 23 | import gapic.samplegen_utils.types as types |
24 | 24 | import gapic.samplegen_utils.yaml as gapic_yaml |
25 | | -from gapic.schema import (api, naming) |
| 25 | +from gapic.schema import (api, metadata, naming) |
26 | 26 | import gapic.schema.wrappers as wrappers |
27 | 27 |
|
28 | 28 | from common_types import (DummyField, DummyMessage, |
@@ -1555,12 +1555,103 @@ def test_validate_request_enum_invalid_value(): |
1555 | 1555 |
|
1556 | 1556 |
|
1557 | 1557 | def test_validate_request_enum_not_last_attr(): |
1558 | | - enum = enum_factory("subclass", ["AMMONOIDEA", "COLEOIDEA", "NAUTILOIDEA"]) |
1559 | | - request_type = message_factory("mollusc.subclass", enum=enum) |
| 1558 | + # enum = enum_factory("subclass", ["AMMONOIDEA", "COLEOIDEA", "NAUTILOIDEA"]) |
| 1559 | + # field = make_field(name="subclass", enum=enum) |
| 1560 | + request_type = make_message( |
| 1561 | + name="mollusc", |
| 1562 | + fields=[ |
| 1563 | + make_field( |
| 1564 | + name="subclass", |
| 1565 | + enum=enum_factory( |
| 1566 | + "subclass", ["AMMONOIDEA", "COLEOIDEA", "NAUTILOIDEA"] |
| 1567 | + ) |
| 1568 | + ) |
| 1569 | + ] |
| 1570 | + ) |
| 1571 | + |
| 1572 | + # request_type = message_factory("mollusc.subclass", enum=enum) |
1560 | 1573 | v = samplegen.Validator(DummyMethod(output=message_factory("mollusc_result"), |
1561 | 1574 | input=request_type)) |
1562 | | - with pytest.raises(types.InvalidEnumVariant): |
| 1575 | + with pytest.raises(types.NonTerminalPrimitiveOrEnum): |
1563 | 1576 | v.validate_and_transform_request( |
1564 | 1577 | types.CallingForm.Request, |
1565 | 1578 | [{"field": "subclass.order", "value": "COLEOIDEA"}] |
1566 | 1579 | ) |
| 1580 | + |
| 1581 | + |
| 1582 | +def test_validate_request_primitive_field(): |
| 1583 | + field = make_field(name="species", type="TYPE_STRING") |
| 1584 | + request_type = make_message(name="request", fields=[field]) |
| 1585 | + |
| 1586 | + request = [{"field": "species", "value": "Architeuthis dux"}] |
| 1587 | + v = samplegen.Validator( |
| 1588 | + DummyMethod( |
| 1589 | + output=message_factory("mollusc_result"), |
| 1590 | + input=request_type |
| 1591 | + ) |
| 1592 | + ) |
| 1593 | + |
| 1594 | + actual = v.validate_and_transform_request(types.CallingForm.Request, |
| 1595 | + request) |
| 1596 | + expected = [ |
| 1597 | + samplegen.TransformedRequest( |
| 1598 | + base="species", |
| 1599 | + body=None, |
| 1600 | + single=samplegen.AttributeRequestSetup( |
| 1601 | + value="Architeuthis dux" |
| 1602 | + ) |
| 1603 | + ) |
| 1604 | + ] |
| 1605 | + |
| 1606 | + assert actual == expected |
| 1607 | + |
| 1608 | + |
| 1609 | +def test_validate_request_non_terminal_primitive_field(): |
| 1610 | + field = make_field(name="species", type="TYPE_STRING") |
| 1611 | + request_type = make_message(name="request", fields=[field]) |
| 1612 | + |
| 1613 | + request = [{"field": "species.nomenclature", "value": "Architeuthis dux"}] |
| 1614 | + v = samplegen.Validator( |
| 1615 | + DummyMethod( |
| 1616 | + output=message_factory("mollusc_result"), |
| 1617 | + input=request_type |
| 1618 | + ) |
| 1619 | + ) |
| 1620 | + |
| 1621 | + with pytest.raises(types.NonTerminalPrimitiveOrEnum): |
| 1622 | + v.validate_and_transform_request(types.CallingForm.Request, |
| 1623 | + request) |
| 1624 | + |
| 1625 | + |
| 1626 | +def make_message(name: str, package: str = 'animalia.mollusca.v1', module: str = 'cephalopoda', |
| 1627 | + fields: Sequence[wrappers.Field] = (), meta: metadata.Metadata = None, |
| 1628 | + options: descriptor_pb2.MethodOptions = None, |
| 1629 | + ) -> wrappers.MessageType: |
| 1630 | + message_pb = descriptor_pb2.DescriptorProto( |
| 1631 | + name=name, |
| 1632 | + field=[i.field_pb for i in fields], |
| 1633 | + options=options, |
| 1634 | + ) |
| 1635 | + return wrappers.MessageType( |
| 1636 | + message_pb=message_pb, |
| 1637 | + fields=OrderedDict((i.name, i) for i in fields), |
| 1638 | + nested_messages={}, |
| 1639 | + nested_enums={}, |
| 1640 | + meta=meta or metadata.Metadata(address=metadata.Address( |
| 1641 | + name=name, |
| 1642 | + package=tuple(package.split('.')), |
| 1643 | + module=module, |
| 1644 | + )), |
| 1645 | + ) |
| 1646 | + |
| 1647 | + |
| 1648 | +# Borrowed from test_field.py |
| 1649 | +def make_field(*, message=None, enum=None, **kwargs) -> wrappers.Field: |
| 1650 | + T = descriptor_pb2.FieldDescriptorProto.Type |
| 1651 | + kwargs.setdefault('name', 'my_field') |
| 1652 | + kwargs.setdefault('number', 1) |
| 1653 | + kwargs.setdefault('type', T.Value('TYPE_BOOL')) |
| 1654 | + if isinstance(kwargs['type'], str): |
| 1655 | + kwargs['type'] = T.Value(kwargs['type']) |
| 1656 | + field_pb = descriptor_pb2.FieldDescriptorProto(**kwargs) |
| 1657 | + return wrappers.Field(field_pb=field_pb, message=message, enum=enum) |
0 commit comments