Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
7aacec1
Add ignore_unknown_fields parameter
AdrienVannson Jul 1, 2025
614cca3
Add .gitignore
AdrienVannson Jul 1, 2025
442b2bb
Remove .gitignore
AdrienVannson Jul 1, 2025
4b23f95
Improve test generation
AdrienVannson Jul 1, 2025
729c41e
Fix poe commands
AdrienVannson Jul 1, 2025
4912d18
Fix first tests
AdrienVannson Jul 1, 2025
de2e951
Fix more tests
AdrienVannson Jul 1, 2025
f5a1c5a
Fix more tests
AdrienVannson Jul 1, 2025
b37d057
Fix import
AdrienVannson Jul 19, 2025
b790706
Fix workflow
AdrienVannson Jul 19, 2025
1178f73
Fix any test
AdrienVannson Jul 19, 2025
f7a8551
Fix features test
AdrienVannson Jul 19, 2025
2f13078
Fix grpclib reflection test
AdrienVannson Jul 19, 2025
a829349
Add missing tests
AdrienVannson Jul 19, 2025
31ab93c
Fix service uppercase test
AdrienVannson Jul 19, 2025
6a1eef3
Fix stream_stream
AdrienVannson Jul 19, 2025
1bbe715
Fix message enum descriptors
AdrienVannson Jul 19, 2025
7bf157c
Fix casing
AdrienVannson Jul 19, 2025
5c59625
Fix nested twice
AdrienVannson Jul 20, 2025
bf2824f
Fix more tests
AdrienVannson Jul 20, 2025
c436eda
Fix more tests
AdrienVannson Jul 20, 2025
3d7cbbe
Fix more tests
AdrienVannson Jul 20, 2025
edd8418
Fix more tests
AdrienVannson Jul 20, 2025
eb5ed8e
Fix more tests
AdrienVannson Jul 20, 2025
a3a5027
Delete useless tests
AdrienVannson Jul 21, 2025
fb589b0
Remove useless import
AdrienVannson Jul 23, 2025
7775da2
Fix first input tests
AdrienVannson Jul 26, 2025
7840bec
Fix more tests
AdrienVannson Jul 26, 2025
73359db
Fix more tests
AdrienVannson Jul 26, 2025
befe8a2
Add remaining tests
AdrienVannson Jul 26, 2025
168e2b5
Disable ruff warning
AdrienVannson Jul 26, 2025
1427054
Remove comments
AdrienVannson Jul 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:

- name: Move compiled files to betterproto2
shell: bash
run: mv betterproto2_compiler/tests/output_betterproto betterproto2_compiler/tests/output_betterproto_pydantic betterproto2_compiler/tests/output_betterproto_descriptor betterproto2_compiler/tests/output_reference betterproto2/tests
run: cp -r betterproto2_compiler/tests/outputs betterproto2/tests

- name: Execute test suite
working-directory: ./betterproto2
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
.python-version
build/
*/tests/output_*
*/tests/outputs/*
**/__pycache__
dist
**/*.egg-info
Expand All @@ -18,4 +19,4 @@ output
.asv
venv
.devcontainer
.ruff_cache
.ruff_cache
14 changes: 1 addition & 13 deletions betterproto2/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ addopts = "-p no:warnings"
# Dev workflow tasks
[tool.poe.tasks.get-local-compiled-tests]
# task useful for local development. Copies the compiled test files from the compiler folder to the tests folder
shell = "rm -rf tests/output_* && cp -r ../betterproto2_compiler/tests/output_* tests"
shell = "rm -rf tests/outputs* && cp -r ../betterproto2_compiler/tests/outputs tests"

[tool.poe.tasks.test]
cmd = "pytest"
Expand Down Expand Up @@ -138,18 +138,6 @@ rm -rf .coverage .mypy_cache .pytest_cache
"""
help = "Clean out generated files from the workspace"

[tool.poe.tasks.pull-compiled-tests]
shell = """
rm -rf tests/output_* &&
git clone https://github.com/betterproto/python-betterproto2-compiler --branch compiled-test-files --single-branch compiled_files &&
mv compiled_files/tests_betterproto tests/output_betterproto &&
mv compiled_files/tests_betterproto_pydantic tests/output_betterproto_pydantic &&
mv compiled_files/tests_betterproto_pydantic tests/output_betterproto_descriptor &&
mv compiled_files/tests_reference tests/output_reference &&
rm -rf compiled_files
"""
help = "Pulls the compiled test files from the betterproto2-compiler repository"

[tool.poe.tasks.serve-docs]
cmd = "mkdocs serve"
help = "Serve the documentation locally"
2 changes: 1 addition & 1 deletion betterproto2/tests/grpc/test_grpclib_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from grpclib.testing import ChannelFor

from tests.grpc.async_channel import AsyncChannel
from tests.output_betterproto.service import (
from tests.outputs.service.service import (
DoThingRequest,
DoThingResponse,
GetThingRequest,
Expand Down
10 changes: 6 additions & 4 deletions betterproto2/tests/grpc/test_grpclib_reflection.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@
from grpclib.reflection.v1alpha.reflection_grpc import ServerReflectionBase as ServerReflectionBaseV1Alpha
from grpclib.testing import ChannelFor

from tests.output_betterproto.example_service import TestBase
from tests.output_betterproto.grpc.reflection.v1 import (
from tests.outputs.grpclib_reflection.example_service import TestBase
from tests.outputs.grpclib_reflection.grpc.reflection.v1 import (
ErrorResponse,
ListServiceResponse,
ServerReflectionRequest,
ServerReflectionStub,
ServiceResponse,
)
from tests.output_betterproto_descriptor.google_proto_descriptor_pool import default_google_proto_descriptor_pool
from tests.outputs.grpclib_reflection_descriptors.google_proto_descriptor_pool import (
default_google_proto_descriptor_pool,
)


class TestService(TestBase):
Expand Down Expand Up @@ -78,7 +80,7 @@ async def test_grpclib_reflection():
assert response.file_descriptor_response is None

# now it should work
import tests.output_betterproto_descriptor.example_service as example_service_with_desc
import tests.outputs.grpclib_reflection_descriptors.example_service as example_service_with_desc

requests.put(ServerReflectionRequest(file_containing_symbol="example_service.Test"))
response = await anext(responses)
Expand Down
10 changes: 7 additions & 3 deletions betterproto2/tests/grpc/test_message_enum_descriptors.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import pytest

from tests.output_betterproto.import_cousin_package_same_name.test.subpackage import Test
from tests.outputs.import_cousin_package_same_name.import_cousin_package_same_name.test.subpackage import Test

# importing the cousin should cause no descriptor pool errors since the subpackage imports it once already
from tests.output_betterproto_descriptor.import_cousin_package_same_name.cousin.subpackage import CousinMessage
from tests.output_betterproto_descriptor.import_cousin_package_same_name.test.subpackage import Test as TestWithDesc
from tests.outputs.import_cousin_package_same_name_descriptors.import_cousin_package_same_name.cousin.subpackage import ( # noqa: E501
CousinMessage,
)
from tests.outputs.import_cousin_package_same_name_descriptors.import_cousin_package_same_name.test.subpackage import (
Test as TestWithDesc,
)


def test_message_enum_descriptors():
Expand Down
2 changes: 1 addition & 1 deletion betterproto2/tests/grpc/test_stream_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pytest

from tests.grpc.async_channel import AsyncChannel
from tests.output_betterproto.stream_stream import Message
from tests.outputs.stream_stream.stream_stream import Message


@pytest.fixture
Expand Down
2 changes: 1 addition & 1 deletion betterproto2/tests/grpc/thing_service.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import grpclib
import grpclib.server

from tests.output_betterproto.service import (
from tests.outputs.service.service import (
DoThingRequest,
DoThingResponse,
GetThingRequest,
Expand Down
8 changes: 4 additions & 4 deletions betterproto2/tests/inputs/bool/test_bool.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,28 @@


def test_value():
from tests.output_betterproto.bool import Test
from tests.outputs.bool.bool import Test

message = Test()
assert not message.value, "Boolean is False by default"


def test_pydantic_no_value():
from tests.output_betterproto_pydantic.bool import Test as TestPyd
from tests.outputs.bool_pydantic.bool import Test as TestPyd

message = TestPyd()
assert not message.value, "Boolean is False by default"


def test_pydantic_value():
from tests.output_betterproto_pydantic.bool import Test as TestPyd
from tests.outputs.bool_pydantic.bool import Test as TestPyd

message = TestPyd(value=False)
assert not message.value


def test_pydantic_bad_value():
from tests.output_betterproto_pydantic.bool import Test as TestPyd
from tests.outputs.bool_pydantic.bool import Test as TestPyd

with pytest.raises(ValueError):
TestPyd(value=123)
4 changes: 2 additions & 2 deletions betterproto2/tests/inputs/casing/test_casing.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import tests.output_betterproto.casing as casing
from tests.output_betterproto.casing import Test
import tests.outputs.casing.casing as casing
from tests.outputs.casing.casing import Test


def test_message_attributes():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import tests.output_betterproto.casing_inner_class as casing_inner_class
import tests.outputs.casing_inner_class.casing_inner_class as casing_inner_class


def test_message_casing_inner_class_name():
Expand Down
7 changes: 0 additions & 7 deletions betterproto2/tests/inputs/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,3 @@
"empty_service",
"service_uppercase",
}


# Indicate json sample messages to skip when testing that json (de)serialization
# is symmetrical becuase some cases legitimately are not symmetrical.
# Each key references the name of the test scenario and the values in the tuple
# Are the names of the json files.
non_symmetrical_json = {"empty_repeated": ("empty_repeated",)}
3 changes: 0 additions & 3 deletions betterproto2/tests/inputs/empty_repeated/empty_repeated.json

This file was deleted.

2 changes: 1 addition & 1 deletion betterproto2/tests/inputs/enum/test_enum.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from tests.output_betterproto.enum import (
from tests.outputs.enum.enum import (
ArithmeticOperator,
Choice,
Test,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import pytest
from grpclib.testing import ChannelFor

from tests.output_betterproto.example_service import (
from tests.outputs.example_service.example_service import (
ExampleRequest,
ExampleResponse,
TestBase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
from google.protobuf import json_format
from google.protobuf.timestamp_pb2 import Timestamp

from tests.output_betterproto.google_impl_behavior_equivalence import (
from tests.outputs.google_impl_behavior_equivalence.google_impl_behavior_equivalence import (
Empty,
Foo,
Request,
Spam,
Test,
)
from tests.output_reference.google_impl_behavior_equivalence.google_impl_behavior_equivalence_pb2 import (
from tests.outputs.google_impl_behavior_equivalence_reference.google_impl_behavior_equivalence_pb2 import (
Empty as ReferenceEmpty,
Foo as ReferenceFoo,
Request as ReferenceRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@

import pytest

import tests.output_betterproto.google.protobuf as protobuf
import tests.outputs.googletypes_request.google.protobuf as protobuf
from tests.mocks import MockChannel
from tests.output_betterproto.googletypes_request import (
Input,
TestStub,
)
from tests.outputs.googletypes_request.googletypes_request import Input, TestStub

test_cases = [
(TestStub.send_double, protobuf.DoubleValue, 2.5),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,9 @@

import pytest

import tests.output_betterproto.google.protobuf as protobuf
import tests.outputs.googletypes_response.google.protobuf as protobuf
from tests.mocks import MockChannel
from tests.output_betterproto.googletypes_response import (
Input,
TestStub,
)
from tests.outputs.googletypes_response.googletypes_response import Input, TestStub

test_cases = [
(TestStub.get_double, protobuf.DoubleValue, 2.5),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pytest

from tests.mocks import MockChannel
from tests.output_betterproto.googletypes_response_embedded import (
from tests.outputs.googletypes_response_embedded.googletypes_response_embedded import (
Input,
Output,
TestStub,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import pytest

from tests.mocks import MockChannel
from tests.output_betterproto.import_service_input_message import (
from tests.outputs.import_service_input_message.import_service_input_message import (
NestedRequestMessage,
RequestMessage,
RequestResponse,
TestStub,
)
from tests.output_betterproto.import_service_input_message.child import (
from tests.outputs.import_service_input_message.import_service_input_message.child import (
ChildRequestMessage,
)

Expand Down
4 changes: 2 additions & 2 deletions betterproto2/tests/inputs/invalid_field/test_invalid_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


def test_invalid_field():
from tests.output_betterproto.invalid_field import Test
from tests.outputs.invalid_field.invalid_field import Test

with pytest.raises(TypeError):
Test(unknown_field=12)
Expand All @@ -11,7 +11,7 @@ def test_invalid_field():
def test_invalid_field_pydantic():
from pydantic import ValidationError

from tests.output_betterproto_pydantic.invalid_field import Test
from tests.outputs.invalid_field_pydantic.invalid_field import Test

with pytest.raises(ValidationError):
Test(unknown_field=12)
2 changes: 1 addition & 1 deletion betterproto2/tests/inputs/nestedtwice/test_nestedtwice.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import pytest

from tests.output_betterproto.nestedtwice import (
from tests.outputs.nestedtwice.nestedtwice import (
Test,
TestTop,
TestTopMiddle,
Expand Down
10 changes: 5 additions & 5 deletions betterproto2/tests/inputs/oneof/test_oneof.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,28 @@


def test_which_count():
from tests.output_betterproto.oneof import Test
from tests.outputs.oneof.oneof import Test

message = Test.from_json(get_test_case_json_data("oneof")[0].json)
assert betterproto2.which_one_of(message, "foo") == ("pitied", 100)


def test_which_name():
from tests.output_betterproto.oneof import Test
from tests.outputs.oneof.oneof import Test

message = Test.from_json(get_test_case_json_data("oneof", "oneof_name.json")[0].json)
assert betterproto2.which_one_of(message, "foo") == ("pitier", "Mr. T")


def test_which_count_pyd():
from tests.output_betterproto_pydantic.oneof import Test as TestPyd
from tests.outputs.oneof_pydantic.oneof import Test

message = TestPyd(pitier="Mr. T", just_a_regular_field=2, bar_name="a_bar")
message = Test(pitier="Mr. T", just_a_regular_field=2, bar_name="a_bar")
assert betterproto2.which_one_of(message, "foo") == ("pitier", "Mr. T")


def test_oneof_constructor_assign():
from tests.output_betterproto.oneof import MixedDrink, Test
from tests.outputs.oneof.oneof import MixedDrink, Test

message = Test(mixed_drink=MixedDrink(shots=42))
field, value = betterproto2.which_one_of(message, "bar")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import datetime

import betterproto2
from tests.output_betterproto.oneof_default_value_serialization import (
from tests.outputs.oneof_default_value_serialization.oneof_default_value_serialization import (
Message,
NestedMessage,
Test,
Expand Down
2 changes: 1 addition & 1 deletion betterproto2/tests/inputs/oneof_enum/test_oneof_enum.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import betterproto2
from tests.output_betterproto.oneof_enum import Move, Signal, Test
from tests.outputs.oneof_enum.oneof_enum import Move, Signal, Test
from tests.util import get_test_case_json_data


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import json

from tests.output_betterproto.proto3_field_presence import (
Test,
)
from tests.outputs.proto3_field_presence.proto3_field_presence import Test


def test_null_fields_json():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
from tests.output_betterproto.proto3_field_presence_oneof import (
Nested,
Test,
WithOptional,
)
from tests.outputs.proto3_field_presence_oneof.proto3_field_presence_oneof import Nested, Test, WithOptional


def test_serialization():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from tests.output_betterproto.regression_387 import ParentElement, Test
from tests.outputs.regression_387.regression_387 import ParentElement, Test


def test_regression_387():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from tests.output_betterproto.regression_414 import Test
from tests.outputs.regression_414.regression_414 import Test


def test_full_cycle():
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
from datetime import (
datetime,
timedelta,
)
from datetime import datetime, timedelta

from tests.output_betterproto.repeated_duration_timestamp import Test
from tests.outputs.repeated_duration_timestamp.repeated_duration_timestamp import Test


def test_roundtrip():
Expand Down
Loading
Loading