33
44import audit_table
55from common .models .errors import UnhandledAuditTableError
6+ from constants import AUDIT_TABLE_NAME , AuditTableKeys , FileStatus
67
78
89class TestAuditTable (unittest .TestCase ):
@@ -17,9 +18,16 @@ def tearDown(self):
1718
1819 def test_change_audit_table_status_to_processed_success (self ):
1920 # Should not raise
20- self .mock_dynamodb_client .update_item .return_value = {}
2121 audit_table .change_audit_table_status_to_processed ("file1" , "msg1" )
22- self .mock_dynamodb_client .update_item .assert_called_once ()
22+ self .mock_dynamodb_client .update_item .assert_called_once_with (
23+ TableName = AUDIT_TABLE_NAME ,
24+ Key = {AuditTableKeys .MESSAGE_ID : {"S" : "msg1" }},
25+ UpdateExpression = "SET #status = :status" ,
26+ ExpressionAttributeNames = {"#status" : "status" },
27+ ExpressionAttributeValues = {":status" : {"S" : FileStatus .PROCESSED }},
28+ ConditionExpression = "attribute_exists(message_id)" ,
29+ ReturnValues = "UPDATED_NEW" ,
30+ )
2331 self .mock_logger .info .assert_called_once ()
2432
2533 def test_change_audit_table_status_to_processed_raises (self ):
@@ -46,3 +54,83 @@ def test_get_record_count_by_message_id_returns_none_if_record_count_not_set(sel
4654 self .mock_dynamodb_client .get_item .return_value = {"Item" : {"message_id" : {"S" : test_message_id }}}
4755
4856 self .assertIsNone (audit_table .get_record_count_by_message_id (test_message_id ))
57+
58+ def test_set_records_succeeded_count (self ):
59+ test_message_id = "1234"
60+ self .mock_dynamodb_client .get_item .return_value = {
61+ "Item" : {"message_id" : {"S" : test_message_id }, "record_count" : {"N" : "1000" }, "records_failed" : {"N" : "42" }}
62+ }
63+ audit_table .set_records_succeeded_count (test_message_id )
64+ self .mock_dynamodb_client .get_item .assert_called_once ()
65+ self .mock_dynamodb_client .update_item .assert_called_once_with (
66+ TableName = AUDIT_TABLE_NAME ,
67+ Key = {AuditTableKeys .MESSAGE_ID : {"S" : test_message_id }},
68+ UpdateExpression = "SET #counter = :value" ,
69+ ExpressionAttributeNames = {"#counter" : AuditTableKeys .RECORDS_SUCCEEDED },
70+ ExpressionAttributeValues = {":value" : {"N" : "958" }},
71+ ConditionExpression = "attribute_exists(message_id)" ,
72+ ReturnValues = "UPDATED_NEW" ,
73+ )
74+ self .mock_logger .info .assert_called_once ()
75+
76+ def test_set_records_succeeded_count_no_failures (self ):
77+ test_message_id = "1234"
78+ self .mock_dynamodb_client .get_item .return_value = {
79+ "Item" : {"message_id" : {"S" : test_message_id }, "record_count" : {"N" : "1000" }}
80+ }
81+ audit_table .set_records_succeeded_count (test_message_id )
82+ self .mock_dynamodb_client .get_item .assert_called_once ()
83+ self .mock_dynamodb_client .update_item .assert_called_once_with (
84+ TableName = AUDIT_TABLE_NAME ,
85+ Key = {AuditTableKeys .MESSAGE_ID : {"S" : test_message_id }},
86+ UpdateExpression = "SET #counter = :value" ,
87+ ExpressionAttributeNames = {"#counter" : AuditTableKeys .RECORDS_SUCCEEDED },
88+ ExpressionAttributeValues = {":value" : {"N" : "1000" }},
89+ ConditionExpression = "attribute_exists(message_id)" ,
90+ ReturnValues = "UPDATED_NEW" ,
91+ )
92+ self .mock_logger .info .assert_called_once ()
93+
94+ def test_set_records_succeeded_count_no_records (self ):
95+ test_message_id = "1234"
96+ self .mock_dynamodb_client .get_item .return_value = {"Item" : {"message_id" : {"S" : test_message_id }}}
97+ audit_table .set_records_succeeded_count (test_message_id )
98+ self .mock_dynamodb_client .get_item .assert_called_once ()
99+ self .mock_dynamodb_client .update_item .assert_called_once_with (
100+ TableName = AUDIT_TABLE_NAME ,
101+ Key = {AuditTableKeys .MESSAGE_ID : {"S" : test_message_id }},
102+ UpdateExpression = "SET #counter = :value" ,
103+ ExpressionAttributeNames = {"#counter" : AuditTableKeys .RECORDS_SUCCEEDED },
104+ ExpressionAttributeValues = {":value" : {"N" : "0" }},
105+ ConditionExpression = "attribute_exists(message_id)" ,
106+ ReturnValues = "UPDATED_NEW" ,
107+ )
108+ self .mock_logger .info .assert_called_once ()
109+
110+ def test_set_records_succeeded_count_raises (self ):
111+ self .mock_dynamodb_client .update_item .side_effect = Exception ("fail!" )
112+ with self .assertRaises (UnhandledAuditTableError ) as ctx :
113+ audit_table .set_records_succeeded_count ("msg1" )
114+ self .assertIn ("fail!" , str (ctx .exception ))
115+ self .mock_logger .error .assert_called_once ()
116+
117+ def test_increment_records_failed_count (self ):
118+ test_message_id = "1234"
119+ audit_table .increment_records_failed_count (test_message_id )
120+ self .mock_dynamodb_client .update_item .assert_called_once_with (
121+ TableName = AUDIT_TABLE_NAME ,
122+ Key = {AuditTableKeys .MESSAGE_ID : {"S" : test_message_id }},
123+ UpdateExpression = "SET #counter = if_not_exists(#counter, :initial) + :increment" ,
124+ ExpressionAttributeNames = {"#counter" : AuditTableKeys .RECORDS_FAILED },
125+ ExpressionAttributeValues = {":increment" : {"N" : "1" }, ":initial" : {"N" : "0" }},
126+ ConditionExpression = "attribute_exists(message_id)" ,
127+ ReturnValues = "UPDATED_NEW" ,
128+ )
129+ self .mock_logger .info .assert_called_once ()
130+
131+ def test_increment_records_failed_count_raises (self ):
132+ self .mock_dynamodb_client .update_item .side_effect = Exception ("fail!" )
133+ with self .assertRaises (UnhandledAuditTableError ) as ctx :
134+ audit_table .increment_records_failed_count ("msg1" )
135+ self .assertIn ("fail!" , str (ctx .exception ))
136+ self .mock_logger .error .assert_called_once ()
0 commit comments