summaryrefslogtreecommitdiffstats
path: root/tests/inputs/proto3_field_presence
diff options
context:
space:
mode:
Diffstat (limited to 'tests/inputs/proto3_field_presence')
-rw-r--r--tests/inputs/proto3_field_presence/proto3_field_presence.json13
-rw-r--r--tests/inputs/proto3_field_presence/proto3_field_presence.proto26
-rw-r--r--tests/inputs/proto3_field_presence/proto3_field_presence_default.json1
-rw-r--r--tests/inputs/proto3_field_presence/proto3_field_presence_missing.json9
-rw-r--r--tests/inputs/proto3_field_presence/test_proto3_field_presence.py48
5 files changed, 97 insertions, 0 deletions
diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence.json b/tests/inputs/proto3_field_presence/proto3_field_presence.json
new file mode 100644
index 0000000..988df8e
--- /dev/null
+++ b/tests/inputs/proto3_field_presence/proto3_field_presence.json
@@ -0,0 +1,13 @@
+{
+ "test1": 128,
+ "test2": true,
+ "test3": "A value",
+ "test4": "aGVsbG8=",
+ "test5": {
+ "test": "Hello"
+ },
+ "test6": "B",
+ "test7": "8589934592",
+ "test8": 2.5,
+ "test9": "2022-01-24T12:12:42Z"
+}
diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence.proto b/tests/inputs/proto3_field_presence/proto3_field_presence.proto
new file mode 100644
index 0000000..f28123d
--- /dev/null
+++ b/tests/inputs/proto3_field_presence/proto3_field_presence.proto
@@ -0,0 +1,26 @@
+syntax = "proto3";
+
+package proto3_field_presence;
+
+import "google/protobuf/timestamp.proto";
+
+message InnerTest {
+ string test = 1;
+}
+
+message Test {
+ optional uint32 test1 = 1;
+ optional bool test2 = 2;
+ optional string test3 = 3;
+ optional bytes test4 = 4;
+ optional InnerTest test5 = 5;
+ optional TestEnum test6 = 6;
+ optional uint64 test7 = 7;
+ optional float test8 = 8;
+ optional google.protobuf.Timestamp test9 = 9;
+}
+
+enum TestEnum {
+ A = 0;
+ B = 1;
+}
diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence_default.json b/tests/inputs/proto3_field_presence/proto3_field_presence_default.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/inputs/proto3_field_presence/proto3_field_presence_default.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/inputs/proto3_field_presence/proto3_field_presence_missing.json b/tests/inputs/proto3_field_presence/proto3_field_presence_missing.json
new file mode 100644
index 0000000..b19ae98
--- /dev/null
+++ b/tests/inputs/proto3_field_presence/proto3_field_presence_missing.json
@@ -0,0 +1,9 @@
+{
+ "test1": 0,
+ "test2": false,
+ "test3": "",
+ "test4": "",
+ "test6": "A",
+ "test7": "0",
+ "test8": 0
+}
diff --git a/tests/inputs/proto3_field_presence/test_proto3_field_presence.py b/tests/inputs/proto3_field_presence/test_proto3_field_presence.py
new file mode 100644
index 0000000..80696b2
--- /dev/null
+++ b/tests/inputs/proto3_field_presence/test_proto3_field_presence.py
@@ -0,0 +1,48 @@
+import json
+
+from tests.output_aristaproto.proto3_field_presence import (
+ InnerTest,
+ Test,
+ TestEnum,
+)
+
+
+def test_null_fields_json():
+ """Ensure that using "null" in JSON is equivalent to not specifying a
+ field, for fields with explicit presence"""
+
+ def test_json(ref_json: str, obj_json: str) -> None:
+ """`ref_json` and `obj_json` are JSON strings describing a `Test` object.
+ Test that deserializing both leads to the same object, and that
+ `ref_json` is the normalized format."""
+ ref_obj = Test().from_json(ref_json)
+ obj = Test().from_json(obj_json)
+
+ assert obj == ref_obj
+ assert json.loads(obj.to_json(0)) == json.loads(ref_json)
+
+ test_json("{}", '{ "test1": null, "test2": null, "test3": null }')
+ test_json("{}", '{ "test4": null, "test5": null, "test6": null }')
+ test_json("{}", '{ "test7": null, "test8": null }')
+ test_json('{ "test5": {} }', '{ "test3": null, "test5": {} }')
+
+ # Make sure that if include_default_values is set, None values are
+ # exported.
+ obj = Test()
+ assert obj.to_dict() == {}
+ assert obj.to_dict(include_default_values=True) == {
+ "test1": None,
+ "test2": None,
+ "test3": None,
+ "test4": None,
+ "test5": None,
+ "test6": None,
+ "test7": None,
+ "test8": None,
+ "test9": None,
+ }
+
+
+def test_unset_access(): # see #523
+ assert Test().test1 is None
+ assert Test(test1=None).test1 is None