From b72875c3cc5416bb33fb3c2e975aa6aaaebaead4 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Fri, 14 Aug 2026 12:38:43 -0400 Subject: [PATCH 1/8] adding in unit test to reproduce and fix datetime error /bug. updated bug fix guess to record.py --- src/vinyldns/record.py | 1 + tests/test_records.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/vinyldns/record.py b/src/vinyldns/record.py index 97bda16..e95c7ac 100644 --- a/src/vinyldns/record.py +++ b/src/vinyldns/record.py @@ -227,6 +227,7 @@ def from_dict(d): status=d.get('status'), created=map_option(d.get('created'), parse_datetime), updated=d.get('updated'), + # updated=map_option(d.get('updated'), parse_datetime), records=[rdata_converters[d['type']](rd) for rd in d.get('records', [])], id=d.get('id'), owner_group_id=d.get('ownerGroupId'), diff --git a/tests/test_records.py b/tests/test_records.py index a5c4f28..35cb7f5 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -19,6 +19,8 @@ from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse from vinyldns.serdes import to_json_string, from_json_string +from vinyldns.serdes import parse_datetime + def check_record_sets_are_equal(a, b): if a is None: @@ -72,6 +74,25 @@ def test_update_record_set(record_set, mocked_responses, vinyldns_client): check_record_set_changes_are_equal(change, r) mocked_responses.reset() +def test_update_record_set_bad_dates(record_set, mocked_responses, vinyldns_client): + rs = copy.deepcopy(record_set) + rs.id = rs.name + 'id' + rs.created = parse_datetime("2019-06-25T16:37:09+00:00") + rs.updated = parse_datetime("2019-06-25T16:37:09+00:00") + change = gen_rs_change(rs) + mocked_responses.add( + responses.PUT, f'http://test.com/zones/{rs.zone_id}/recordsets/{rs.id}', + body=to_json_string(change), status=400 + ) + r = vinyldns_client.update_record_set(rs) + # data = r.body + # print(data.status_code) + # assert data.status_code == 400 + check_record_set_changes_are_equal(change, r) + mocked_responses.reset() + + + def test_delete_record_set(record_set, mocked_responses, vinyldns_client): rs = copy.deepcopy(record_set) @@ -95,6 +116,7 @@ def test_get_record_set(record_set, mocked_responses, vinyldns_client): body=to_json_string(response), status=200 ) r = vinyldns_client.get_record_set(rs.zone_id, rs.id) + check_record_sets_are_equal(rs, r) mocked_responses.reset() From ae5531f9f545da0428bac53cb8c2ec5c4fccac9b Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:30:05 -0400 Subject: [PATCH 2/8] removing unecessary fields in update_record_set payload to avoid datetime parsing isues --- src/vinyldns/client.py | 25 +++++++++++++++++++++++-- src/vinyldns/record.py | 1 - tests/conftest.py | 9 ++++++++- tests/test_records.py | 38 +++++++++++++++++++++++++++++--------- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/vinyldns/client.py b/src/vinyldns/client.py index 39416d2..e264837 100644 --- a/src/vinyldns/client.py +++ b/src/vinyldns/client.py @@ -596,18 +596,39 @@ def delete_record_set(self, zone_id, rs_id, **kwargs): def update_record_set(self, record_set, **kwargs): """ - Delete an existing record_set. + Update an existing record_set. :param record_set: the record_set to be updated :return: the content of the response """ url = urljoin(self.index_url, u'/zones/{0}/recordsets/{1}'.format(record_set.zone_id, record_set.id)) + #update payload object to remove unnecessary fields such as status, created, updated, fqdn + payload = self._record_set_update_payload(record_set) response, data = self.__make_request(url, u'PUT', self.headers, - to_json_string(record_set), **kwargs) + to_json_string(payload), **kwargs) return RecordSetChange.from_dict(data) + @staticmethod + def _record_set_update_payload(record_set): + payload = { + "zoneId": record_set.zone_id, + "id": record_set.id, + "name": record_set.name, + "type": record_set.type, + "ttl": record_set.ttl, + "records": record_set.records, + } + + if record_set.owner_group_id is not None: + payload["ownerGroupId"] = record_set.owner_group_id + + if record_set.record_set_group_change is not None: + payload["recordSetGroupChange"] = record_set.record_set_group_change + + return payload + def get_record_set(self, zone_id, rs_id, **kwargs): """ Get an existing record_set. diff --git a/src/vinyldns/record.py b/src/vinyldns/record.py index e95c7ac..97bda16 100644 --- a/src/vinyldns/record.py +++ b/src/vinyldns/record.py @@ -227,7 +227,6 @@ def from_dict(d): status=d.get('status'), created=map_option(d.get('created'), parse_datetime), updated=d.get('updated'), - # updated=map_option(d.get('updated'), parse_datetime), records=[rdata_converters[d['type']](rd) for rd in d.get('records', [])], id=d.get('id'), owner_group_id=d.get('ownerGroupId'), diff --git a/tests/conftest.py b/tests/conftest.py index 2a65a7e..87d7f4b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,12 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. """TODO: Add module docstring.""" +import copy import pytest import responses -from sampledata import record_set_values +from sampledata import record_set_values, record_sets from vinyldns.client import VinylDNSClient +from vinyldns.record import RecordType + def get_rs_type(rs): return rs.type @@ -37,3 +40,7 @@ def mocked_responses(): @pytest.fixture(scope="module") def vinyldns_client(): return VinylDNSClient('http://test.com', 'ok', 'ok') + +@pytest.fixture +def txt_record_set(): + return copy.deepcopy(record_sets[RecordType.TXT]) \ No newline at end of file diff --git a/tests/test_records.py b/tests/test_records.py index 35cb7f5..513cce4 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -13,12 +13,12 @@ # limitations under the License. import copy +import json import responses from sampledata import record_sets, record_set_values, gen_rs_change, forward_zone from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse from vinyldns.serdes import to_json_string, from_json_string - from vinyldns.serdes import parse_datetime @@ -74,24 +74,44 @@ def test_update_record_set(record_set, mocked_responses, vinyldns_client): check_record_set_changes_are_equal(change, r) mocked_responses.reset() -def test_update_record_set_bad_dates(record_set, mocked_responses, vinyldns_client): - rs = copy.deepcopy(record_set) +def test_update_record_set_bad_dates(txt_record_set, mocked_responses, vinyldns_client): + rs = copy.deepcopy(txt_record_set) rs.id = rs.name + 'id' rs.created = parse_datetime("2019-06-25T16:37:09+00:00") rs.updated = parse_datetime("2019-06-25T16:37:09+00:00") + rs.status = "Active" + rs.fqdn = "testfqdn" + change = gen_rs_change(rs) + mocked_responses.add( responses.PUT, f'http://test.com/zones/{rs.zone_id}/recordsets/{rs.id}', - body=to_json_string(change), status=400 + body=to_json_string(change), status=200 ) r = vinyldns_client.update_record_set(rs) - # data = r.body - # print(data.status_code) - # assert data.status_code == 400 - check_record_set_changes_are_equal(change, r) - mocked_responses.reset() + payload = json.loads( + mocked_responses.calls[-1].request.body + ) + + assert payload['zoneId'] == rs.zone_id + assert payload['id'] == rs.id + assert payload['name'] == rs.name + assert payload['type'] == rs.type + assert payload['ttl'] == rs.ttl + assert payload['records'] + assert 'created' not in payload + assert 'updated' not in payload + assert 'status' not in payload + assert 'fqdn' not in payload + + check_record_set_changes_are_equal(change, r) + mocked_responses.reset() + # # assert not hasattr(r, "created") + # assert not hasattr(r, "updated") + # # assert not hasattr(r, "status") + # assert not hasattr(r, "fqdn") def test_delete_record_set(record_set, mocked_responses, vinyldns_client): From 8de41659c11ecf5e291ef941b28995360a0b17b9 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 15:46:27 -0400 Subject: [PATCH 3/8] fixing formatting issues --- src/vinyldns/client.py | 1 - tests/conftest.py | 5 ++--- tests/test_records.py | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vinyldns/client.py b/src/vinyldns/client.py index e264837..a40cd40 100644 --- a/src/vinyldns/client.py +++ b/src/vinyldns/client.py @@ -603,7 +603,6 @@ def update_record_set(self, record_set, **kwargs): """ url = urljoin(self.index_url, u'/zones/{0}/recordsets/{1}'.format(record_set.zone_id, record_set.id)) - #update payload object to remove unnecessary fields such as status, created, updated, fqdn payload = self._record_set_update_payload(record_set) response, data = self.__make_request(url, u'PUT', self.headers, to_json_string(payload), **kwargs) diff --git a/tests/conftest.py b/tests/conftest.py index 87d7f4b..14e33a4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,12 +13,10 @@ # limitations under the License. """TODO: Add module docstring.""" import copy - import pytest import responses from sampledata import record_set_values, record_sets from vinyldns.client import VinylDNSClient - from vinyldns.record import RecordType @@ -41,6 +39,7 @@ def mocked_responses(): def vinyldns_client(): return VinylDNSClient('http://test.com', 'ok', 'ok') + @pytest.fixture def txt_record_set(): - return copy.deepcopy(record_sets[RecordType.TXT]) \ No newline at end of file + return copy.deepcopy(record_sets[RecordType.TXT]) diff --git a/tests/test_records.py b/tests/test_records.py index 513cce4..be6d4f7 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -74,6 +74,7 @@ def test_update_record_set(record_set, mocked_responses, vinyldns_client): check_record_set_changes_are_equal(change, r) mocked_responses.reset() + def test_update_record_set_bad_dates(txt_record_set, mocked_responses, vinyldns_client): rs = copy.deepcopy(txt_record_set) rs.id = rs.name + 'id' From 210668305026168cce729d798e143e84414a88b8 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 15:54:01 -0400 Subject: [PATCH 4/8] fixing formatting issues --- tests/test_records.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/test_records.py b/tests/test_records.py index be6d4f7..890b5b4 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -80,8 +80,8 @@ def test_update_record_set_bad_dates(txt_record_set, mocked_responses, vinyldns_ rs.id = rs.name + 'id' rs.created = parse_datetime("2019-06-25T16:37:09+00:00") rs.updated = parse_datetime("2019-06-25T16:37:09+00:00") - rs.status = "Active" - rs.fqdn = "testfqdn" + rs.status = RecordSetStatus.Active + rs.fqdn = f'{rs.name}.bar.' change = gen_rs_change(rs) @@ -109,10 +109,6 @@ def test_update_record_set_bad_dates(txt_record_set, mocked_responses, vinyldns_ check_record_set_changes_are_equal(change, r) mocked_responses.reset() - # # assert not hasattr(r, "created") - # assert not hasattr(r, "updated") - # # assert not hasattr(r, "status") - # assert not hasattr(r, "fqdn") def test_delete_record_set(record_set, mocked_responses, vinyldns_client): From da96bda54daedbded9dca520ffe7fd65ec79eee4 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:00:11 -0400 Subject: [PATCH 5/8] fixing formatting issues --- tests/test_records.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_records.py b/tests/test_records.py index 890b5b4..716a8a5 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -21,6 +21,8 @@ from vinyldns.serdes import to_json_string, from_json_string from vinyldns.serdes import parse_datetime +from vinyldns.record import RecordSetStatus + def check_record_sets_are_equal(a, b): if a is None: From 599fdd3a097aa6998a9bf458c226443dbb5bab41 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:00:20 -0400 Subject: [PATCH 6/8] fixing formatting issues --- tests/test_records.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_records.py b/tests/test_records.py index 716a8a5..63c16eb 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -20,7 +20,6 @@ from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse from vinyldns.serdes import to_json_string, from_json_string from vinyldns.serdes import parse_datetime - from vinyldns.record import RecordSetStatus From b53aee2c15b2da747864e9ca9f16e20460470b8d Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:02:59 -0400 Subject: [PATCH 7/8] fixing formatting issues --- tests/test_records.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_records.py b/tests/test_records.py index 63c16eb..584cfaa 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -14,13 +14,10 @@ import copy import json - import responses from sampledata import record_sets, record_set_values, gen_rs_change, forward_zone -from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse -from vinyldns.serdes import to_json_string, from_json_string -from vinyldns.serdes import parse_datetime -from vinyldns.record import RecordSetStatus +from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse, RecordSetStatus +from vinyldns.serdes import to_json_string, from_json_string, parse_datetime def check_record_sets_are_equal(a, b): From faf4f77483781812cd98413cc932ad42662fdc80 Mon Sep 17 00:00:00 2001 From: Meghan Schaefer <315495672+mschaefer28@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:07:22 -0400 Subject: [PATCH 8/8] fixing formatting issues --- tests/test_records.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_records.py b/tests/test_records.py index 584cfaa..1fa082c 100644 --- a/tests/test_records.py +++ b/tests/test_records.py @@ -16,7 +16,8 @@ import json import responses from sampledata import record_sets, record_set_values, gen_rs_change, forward_zone -from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse, ListRecordSetChangesResponse, RecordSetStatus +from vinyldns.record import RecordSet, RecordSetChange, ListRecordSetsResponse +from vinyldns.record import ListRecordSetChangesResponse, RecordSetStatus from vinyldns.serdes import to_json_string, from_json_string, parse_datetime