feat: price home delivery with Jadlog
All checks were successful
Build and deploy / Validate source (push) Successful in 1m18s
Build and deploy / Integration suite on a real stack (push) Successful in 2m33s
Build and deploy / Secret scan and release gate (push) Successful in 9s
Build and deploy / Publish images (push) Successful in 1m42s
All checks were successful
Build and deploy / Validate source (push) Successful in 1m18s
Build and deploy / Integration suite on a real stack (push) Successful in 2m33s
Build and deploy / Secret scan and release gate (push) Successful in 9s
Build and deploy / Publish images (push) Successful in 1m42s
FREIGHT_ADAPTER=jadlog prices "Receber em casa" through Jadlog's Simulador de Frete from the order's billed metres and value, adding production days to Jadlog's delivery time. The package weight is a base plus a weight per metre from the client, with no default: the adapter refuses to start without it and without the credentials. The cart re-quotes when the package changes, and approval quotes again from the server-priced items. The production stack takes the Jadlog settings, so the read-only probe runs from the worker's console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,11 +4,13 @@ This proves the manual's contract only; app.jadlog_probe must still confirm
|
||||
it on the client's account. Runs where httpx is installed.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import unittest
|
||||
from unittest import mock
|
||||
|
||||
import httpx
|
||||
|
||||
from app.jadlog import QUOTE_URL, JadlogError, JadlogQuotes
|
||||
from app.jadlog import QUOTE_URL, JadlogError, JadlogFreight, JadlogQuotes
|
||||
from app.jadlog_probe import run
|
||||
|
||||
CNPJ = '11.222.333/0001-81'
|
||||
@@ -66,6 +68,44 @@ class JadlogQuoteTest(unittest.TestCase):
|
||||
JadlogQuotes(token='tok', cnpj='123')
|
||||
|
||||
|
||||
class JadlogFreightTest(unittest.TestCase):
|
||||
WEIGHTS = {'JADLOG_PESO_BASE_KG': '0.2', 'JADLOG_PESO_POR_METRO_KG': '0.15', 'FREIGHT_PRODUCTION_DAYS': '2'}
|
||||
|
||||
def freight(self, handler, **env):
|
||||
with mock.patch.dict(os.environ, {**self.WEIGHTS, **env}):
|
||||
return JadlogFreight(client(handler))
|
||||
|
||||
def test_package_weight_value_and_days(self):
|
||||
seen = []
|
||||
|
||||
def handler(request):
|
||||
seen.append(json.loads(request.content)['frete'][0])
|
||||
return httpx.Response(200, json={'frete': [{'vltotal': 18.4, 'prazo': 3}]})
|
||||
|
||||
quote = self.freight(handler).quote('jadlog', '01310100', '2.8', 6972)
|
||||
# 0.2 kg of packaging plus 0.15 kg for each of the 2.8 billed metres.
|
||||
self.assertEqual((seen[0]['peso'], seen[0]['vldeclarado'], seen[0]['cepdes']), (0.62, 69.72, '01310100'))
|
||||
self.assertEqual((quote['total_cents'], quote['days'], quote['service']), (1840, 5, 'jadlog'))
|
||||
|
||||
def test_pickup_is_free_and_bad_requests_are_refused(self):
|
||||
freight = self.freight(lambda request: httpx.Response(500))
|
||||
self.assertEqual(freight.quote('pickup', '')['total_cents'], 0)
|
||||
for args in (('mock-standard', '01310100', '1'), ('jadlog', '0131', '1'), ('jadlog', '01310100', None)):
|
||||
with self.subTest(args=args), self.assertRaises(ValueError):
|
||||
freight.quote(*args)
|
||||
|
||||
def test_a_jadlog_failure_is_a_clear_refusal(self):
|
||||
freight = self.freight(lambda request: httpx.Response(200, json={'frete': [{}], 'error': {'id': -1, 'descricao': 'CEP destino invalido'}}))
|
||||
with self.assertRaisesRegex(ValueError, 'CEP destino invalido'):
|
||||
freight.quote('jadlog', '01310100', '1', 100)
|
||||
|
||||
def test_the_weight_has_no_default(self):
|
||||
with mock.patch.dict(os.environ, {}, clear=True), self.assertRaises(KeyError):
|
||||
JadlogFreight(client(lambda request: httpx.Response(200)))
|
||||
with self.assertRaises(RuntimeError):
|
||||
self.freight(lambda request: httpx.Response(200), JADLOG_PESO_POR_METRO_KG='0')
|
||||
|
||||
|
||||
class JadlogProbeTest(unittest.TestCase):
|
||||
def test_bearer_is_tried_once_after_a_401_and_kept(self):
|
||||
headers = []
|
||||
|
||||
Reference in New Issue
Block a user