"""Tests for approval.""" import json from contextlib import nullcontext as does_not_raise import pytest from freezegun import freeze_time from product_review.api import db from product_review.models import approval as approval_model from tests.utils.db_utils import create_test_approval @pytest.mark.parametrize( ( "test_description", "inputs", "note", "expected_new", "expected_dirty", "expected_deleted", "expected_raise", "expected_raise_message", ), [ ( "success with no note.", [ {"review_queue_id": 1, "user_id": "abc-123"}, {"review_queue_id": 2, "user_id": "def-456"}, {"review_queue_id": 3, "user_id": "ghi-789"}, ], None, [ { "approval_id": None, "review_queue_id": 12, "created_datetime": None, "note": None, "user_id": "pji-123", } ], [], [], does_not_raise(), "None", ), ( "success with note.", [ {"review_queue_id": 1, "user_id": "abc-123"}, {"review_queue_id": 2, "user_id": "def-456"}, {"review_queue_id": 3, "user_id": "ghi-789"}, ], "because", [ { "approval_id": None, "review_queue_id": 12, "created_datetime": None, "note": "because", "user_id": "pji-123", } ], [], [], does_not_raise(), "None", ), ( "already approved exception", [ {"review_queue_id": 12, "user_id": "abc-123"}, {"review_queue_id": 2, "user_id": "def-456"}, {"review_queue_id": 3, "user_id": "ghi-789"}, ], None, [], [], [], pytest.raises(Exception), json.dumps( { "status": 409, "code": "exists", "message": 'There is already an approval record for "review_queue_id: 12".', # noqa } ), ), ], ) @freeze_time("0001-02-03") def test_approve( app_context, test_description, inputs, note, expected_new, expected_dirty, expected_deleted, expected_raise, expected_raise_message, ): """Test approve.""" for item in inputs: create_test_approval( review_queue_id=item["review_queue_id"], user_id=item["user_id"] ) app_context.g.request_context.identity_id = "pji-123" with expected_raise as er: approval_model.approve(12, note=note) assert str(getattr(er, "value", None)) == expected_raise_message assert [item.to_dict() for item in db.session.new] == expected_new assert [item.to_dict() for item in db.session.dirty] == expected_dirty assert [item.to_dict() for item in db.session.deleted] == expected_deleted def test_delete(app_context): """Test delete.""" create_test_approval(review_queue_id=2, user_id="def-456") app_context.g.request_context.identity_id = "pji-123" approval_model.delete(2) db.session.commit() approval_model.approve(2) db.session.commit()