Files
dtf-system/tests/test_quote_review.py
Cauê Faleiros 275ebf72c4
All checks were successful
Build and deploy / Validate source (push) Successful in 8s
Build and deploy / Integration suite on a real stack (push) Successful in 2m22s
Build and deploy / Secret scan and release gate (push) Successful in 6s
Build and deploy / Publish images (push) Successful in 1m34s
feat: approve priced carts at checkout so customers can pay at once
Every quote waited for an operator before it could be paid, so an order
placed at night waited for the morning. A cart the Site priced is now
approved when the quote is created, through the same server pricing the
operator's approval uses (app/quote_review.py). Orders above
QUOTE_AUTO_MAX_METRES (50 m) and items claiming a discount on art the Site
could not analyse still wait for review; the Kanban shows which quotes were
approved automatically and why the others wait.

The grade is still computed in the browser (roadmap 3.2, 3.9), so the
discount remains a customer-supplied value until the server computes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:02:56 -03:00

39 lines
1.7 KiB
Python

"""Which quotes the Site approves at checkout and which wait for a person."""
import os
import unittest
from unittest import mock
from app.quote_review import review_reason
def item(mode='avulsa', metres='2', grade=90, quality='ok', version=2):
return {'mode': mode, 'metres': metres, 'grade': grade, 'quality_status': quality,
'quality_acknowledged': quality == 'warning', 'production': {'version': version}}
class ReviewReasonTest(unittest.TestCase):
def reason(self, *items, **env):
with mock.patch.dict(os.environ, env):
return review_reason({'items': list(items)})
def test_a_priced_cart_is_approved(self):
self.assertIsNone(self.reason(item()))
# Accepted resolution warnings and unanalysed art at the full rate too.
self.assertIsNone(self.reason(item(quality='warning'), item(grade=0, quality='unverified')))
def test_large_orders_wait_for_review(self):
self.assertIsNone(self.reason(item(metres='30'), item(metres='20')))
self.assertEqual(self.reason(item(metres='30'), item(metres='20.1')), 'Pedido acima de 50 m')
self.assertEqual(self.reason(item(metres='6'), QUOTE_AUTO_MAX_METRES='5'), 'Pedido acima de 5 m')
def test_a_discount_the_site_could_not_have_given_waits(self):
self.assertEqual(self.reason(item(grade=90, quality='unverified')), 'Nota informada sem análise da arte')
def test_old_layouts_and_switching_it_off(self):
self.assertEqual(self.reason(item(version=1)), 'Montagem antiga')
self.assertEqual(self.reason(item(), QUOTE_AUTO_APPROVE='false'), 'Aprovação automática desligada')
if __name__ == '__main__':
unittest.main()