diff --git a/apps/shipments/serializers/shipment.py b/apps/shipments/serializers/shipment.py index c1a3dfa2..20498496 100644 --- a/apps/shipments/serializers/shipment.py +++ b/apps/shipments/serializers/shipment.py @@ -18,7 +18,6 @@ from collections import OrderedDict from datetime import datetime, timezone -import requests from django.conf import settings from django.contrib.gis.geos import Point from django.db import transaction @@ -277,15 +276,6 @@ def validate_gtx_required(self, gtx_required): raise PermissionDenied('User does not have access to enable GTX for this shipment') return gtx_required - def validate_quickadd_tracking(self, quickadd_tracking): - response = requests.post(f'{settings.AFTERSHIP_URL}couriers/detect', - headers={'aftership-api-key': settings.AFTERSHIP_API_KEY}, - json={'tracking': {'tracking_number': quickadd_tracking}}) - if not response.ok: - raise serializers.ValidationError('Invalid quickadd_tracking value') - - return quickadd_tracking - class ShipmentUpdateSerializer(ShipmentSerializer): device_id = serializers.CharField(max_length=36, allow_null=True) diff --git a/apps/shipments/signals.py b/apps/shipments/signals.py index e84dd181..8d619b13 100644 --- a/apps/shipments/signals.py +++ b/apps/shipments/signals.py @@ -169,6 +169,24 @@ def telemetrydata_post_save(sender, **kwargs): dispatch_uid='shipment_quickadd_tracking_changed') def shipment_quickadd_tracking_changed(sender, instance, changed_fields, **kwargs): if instance.quickadd_tracking and settings.SNS_CLIENT: + response = requests.post(f'{settings.AFTERSHIP_URL}couriers/detect', + headers={'aftership-api-key': settings.AFTERSHIP_API_KEY}, + json={'tracking': {'tracking_number': instance.quickadd_tracking}}) + if not response.ok or not response.json()['data']['couriers']: + raise ValidationError('Invalid quickadd_tracking value') + + slug = response.json()['data']['couriers'][0]['name'] + log_metric( + 'transmission.info', + tags={'method': 'shipments.quickadd_shipment', 'carrier_abbv': slug, 'module': __name__} + ) + + instance.anonymous_historical_change( + shippers_reference=f'Quickadd Shipment: {instance.quickadd_tracking}', + carrier_abbv=slug + ) + instance.refresh_from_db(fields=['shippers_reference', 'carrier_abbv']) + response = requests.post(f'{settings.AFTERSHIP_URL}trackings', json={'tracking': {'tracking_number': instance.quickadd_tracking}}, headers={'aftership-api-key': settings.AFTERSHIP_API_KEY}) @@ -177,15 +195,11 @@ def shipment_quickadd_tracking_changed(sender, instance, changed_fields, **kwarg tracking_data = response.json()['data']['tracking'] - log_metric( - 'transmission.info', - tags={'method': 'shipments.quickadd_shipment', 'carrier_abbv': tracking_data['slug'], 'module': __name__} - ) instance.anonymous_historical_change(shippers_reference=f'Quickadd Shipment: {instance.quickadd_tracking}', carrier_abbv=tracking_data['slug']) instance.refresh_from_db(fields=['shippers_reference', 'carrier_abbv']) - SNSClient().aftership_tracking_update(instance, tracking_data['id'], instance.updated_by) + SNSClient().aftership_tracking_update(instance, tracking_data['id']) @receiver(post_save_changed, sender=Shipment, fields=['device', 'state', 'geofences'], diff --git a/apps/sns.py b/apps/sns.py index d869a5c4..c425426b 100644 --- a/apps/sns.py +++ b/apps/sns.py @@ -19,12 +19,13 @@ def _publish(self, message_type, **kwargs): } ) - def aftership_tracking_update(self, shipment, aftership_id, owner_id): + def aftership_tracking_update(self, shipment, aftership_id): self._publish( SNSClient.MessageType.AFTERSHIP_UPDATE, - ownerId=owner_id, + ownerId=shipment.updated_by, aftershipTrackingId=aftership_id, - shipmentId=shipment.id + shipmentId=shipment.id, + carrierType=shipment.carrier_abbv ) def shipment_update(self, shipment): diff --git a/tests/profiles_enabled/shipments/test_shipments.py b/tests/profiles_enabled/shipments/test_shipments.py index cccd28e2..314a9a15 100644 --- a/tests/profiles_enabled/shipments/test_shipments.py +++ b/tests/profiles_enabled/shipments/test_shipments.py @@ -57,9 +57,11 @@ def set_up(self, profiles_ids, mocked_engine_rpc): @pytest.fixture def mock_aftership_validation_succeess(self, mock_successful_wallet_owner_calls): - mock_successful_wallet_owner_calls.register_uri(mock_successful_wallet_owner_calls.POST, - f'{settings.AFTERSHIP_URL}couriers/detect', - ) + mock_successful_wallet_owner_calls.register_uri( + mock_successful_wallet_owner_calls.POST, + f'{settings.AFTERSHIP_URL}couriers/detect', + body=json.dumps({'data': {'couriers': [{'name': 'aftership-slug'}]}}), + ) return mock_successful_wallet_owner_calls @pytest.fixture @@ -70,6 +72,15 @@ def mock_aftership_validation_failure(self, mock_successful_wallet_owner_calls): ) return mock_successful_wallet_owner_calls + @pytest.fixture + def mock_aftership_validation_no_couriers(self, mock_successful_wallet_owner_calls): + mock_successful_wallet_owner_calls.register_uri( + mock_successful_wallet_owner_calls.POST, + f'{settings.AFTERSHIP_URL}couriers/detect', + body=json.dumps({'data': {'couriers': []}}), + ) + return mock_successful_wallet_owner_calls + @pytest.fixture def mock_aftership_create_success(self, mock_aftership_validation_succeess): mock_aftership_validation_succeess.register_uri( @@ -133,6 +144,12 @@ def test_quickadd_validation_fail(self, client_alice, mock_aftership_validation_ AssertionHelper.HTTP_400(response, error='Invalid quickadd_tracking value') mock_aftership_validation_failure.assert_calls(assertions_aftership_validation) + def test_quickadd_no_couriers(self, client_alice, mock_aftership_validation_no_couriers, + assertions_aftership_validation): + response = client_alice.post(self.create_url, self.base_create_attributes) + AssertionHelper.HTTP_400(response, error='Invalid quickadd_tracking value') + mock_aftership_validation_no_couriers.assert_calls(assertions_aftership_validation) + class TestShipmentsList: url = reverse('shipment-list', kwargs={'version': 'v1'}) diff --git a/tests/profiles_enabled/shipments/test_sns.py b/tests/profiles_enabled/shipments/test_sns.py index 627cec90..6cf1da7e 100644 --- a/tests/profiles_enabled/shipments/test_sns.py +++ b/tests/profiles_enabled/shipments/test_sns.py @@ -48,7 +48,11 @@ def sqs_queue(boto_session, mocked_sns, settings): @pytest.fixture def mocked_aftership_api(modified_http_pretty, settings): - modified_http_pretty.register_uri(modified_http_pretty.POST, f'{settings.AFTERSHIP_URL}couriers/detect') + modified_http_pretty.register_uri( + modified_http_pretty.POST, + f'{settings.AFTERSHIP_URL}couriers/detect', + body=json.dumps({'data': {'couriers': [{'name': 'aftership-slug'}]}}) + ) modified_http_pretty.register_uri(modified_http_pretty.POST, f'{settings.AFTERSHIP_URL}trackings', body=json.dumps({'data': {'tracking': {'id': 'id-from-aftership', 'slug': 'aftership-slug'}}}),) @@ -68,11 +72,18 @@ def test_sns_notifications(self, mocked_sns, sqs_queue, shipment, mocked_aftersh shipment.quickadd_tracking = 'abc123' shipment.save() - modified_http_pretty.assert_calls([{ + modified_http_pretty.assert_calls([ + { + 'host': settings.AFTERSHIP_URL.replace('/v4/', ''), + 'path': '/v4/couriers/detect', + 'body': {'tracking': {'tracking_number': shipment.quickadd_tracking}} + }, + { 'host': settings.AFTERSHIP_URL.replace('/v4/', ''), 'path': '/v4/trackings', 'body': {'tracking': {'tracking_number': shipment.quickadd_tracking}} - }]) + } + ]) messages = sqs_queue.receive_messages(MaxNumberOfMessages=2) assert len(messages) == 2