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
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>
39 lines
1.7 KiB
Python
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()
|