1- import logging
21import main
32import os
3+ import pandas as pd
44import pytest
55
66from datetime import datetime
7- from nypl_py_utils . classes . postgresql_client import PostgreSQLClientError
7+ from pandas . testing import assert_series_equal
88
99_ENVISIONWARE_DATA = [
1010 (10000000 , "barcode1" , 100 , datetime (2023 , 1 , 1 , 1 , 0 , 0 ), "branch1" , "area1" ,
1717 "staff_override4" ),
1818]
1919
20- _SIERRA_DATA = [
21- ("barcode1" , 111111111111 , 1 , 10 , "lib1" ),
22- ("barcode3" , 333333333333 , 3 , 30 , "lib3" ),
23- ("barcode3" , 300000000000 , 30 , 300 , "lib30" ),
24- ("barcode4" , 444444444444 , 4 , 40 , "lib4" ),
25- (None , 444444444444 , None , None , None ),
26- ]
20+ _SIERRA_DF = pd .DataFrame ([
21+ ("111111111111" , "barcode1" , 1 , 10 , "lib1" ),
22+ ("444444444444" , "barcode4" , 4 , 40 , "lib4" )],
23+ columns = ["patron_id" , "barcode" , "ptype_code" , "pcode3" ,
24+ "patron_home_library_code" ]).astype ({"patron_id" : "string" })
2725
28- _REDSHIFT_DATA = (["obf_id1" , "zip1" , "geoid1" ], ["obf_id4" , "zip4" , None ])
26+ _REDSHIFT_DF = pd .DataFrame (
27+ [["obf_id1" , "zip1" , "geoid1" ],],
28+ columns = ["patron_id" , "postal_code" , "geoid" ]
29+ )
2930
3031_RESULTS = [
3132 {"patron_id" : "obf_id1" , "ptype_code" : 1 , "patron_home_library_code" : "lib1" ,
4445 "area" : "area3" , "staff_override" : "staff_override3" ,
4546 "patron_retrieval_status" : "missing" },
4647 {"patron_id" : "obf_id4" , "ptype_code" : 4 , "patron_home_library_code" : "lib4" ,
47- "pcode3" : 40 , "postal_code" : "zip4" , "geoid" : None , "key" : "obf_key4" ,
48+ "pcode3" : 40 , "postal_code" : None , "geoid" : None , "key" : "obf_key4" ,
4849 "minutes_used" : 400 , "transaction_et" : "2023-04-04" , "branch" : "branch4" ,
4950 "area" : "area4" , "staff_override" : "staff_override4" ,
5051 "patron_retrieval_status" : "found" },
@@ -69,6 +70,10 @@ def test_main_one_iteration(self, mock_helpers, mocker):
6970 mock_obfuscate = mocker .patch ("main.obfuscate" , side_effect = [
7071 "obf_key1" , "obf_key2" , "obf_key3" , "obf_key4" ,
7172 "obf_id1" , "obf_id2" , "obf_id3" , "obf_id4" ])
73+ mock_get_sierra_patron_data_from_barcodes = mocker .patch (
74+ "main.get_sierra_patron_data_from_barcodes" , return_value = _SIERRA_DF )
75+ mock_get_redshift_patron_data = mocker .patch (
76+ "main.get_redshift_patron_data" , return_value = _REDSHIFT_DF )
7277
7378 mock_kinesis_client = self ._set_up_mock ("main.KinesisClient" , mocker )
7479
@@ -86,18 +91,8 @@ def test_main_one_iteration(self, mock_helpers, mocker):
8691 )
8792 mock_envisionware_client = self ._set_up_mock ("main.MySQLClient" , mocker )
8893 mock_envisionware_client .execute_query .return_value = _ENVISIONWARE_DATA
89-
90- mock_sierra_query = mocker .patch (
91- "main.build_sierra_query" , return_value = "SIERRA QUERY"
92- )
9394 mock_sierra_client = self ._set_up_mock ("main.PostgreSQLClient" , mocker )
94- mock_sierra_client .execute_query .return_value = _SIERRA_DATA
95-
96- mock_redshift_query = mocker .patch (
97- "main.build_redshift_query" , return_value = "REDSHIFT QUERY"
98- )
9995 mock_redshift_client = self ._set_up_mock ("main.RedshiftClient" , mocker )
100- mock_redshift_client .execute_query .return_value = _REDSHIFT_DATA
10196
10297 main .main ()
10398
@@ -110,18 +105,20 @@ def test_main_one_iteration(self, mock_helpers, mocker):
110105 )
111106 mock_envisionware_client .close_connection .assert_called_once ()
112107
113- mock_sierra_client .connect .assert_called_once ()
114- mock_sierra_query .assert_called_once_with (
115- "'bbarcode1','b25555000000000','bbarcode3','bbarcode4'"
116- )
117- mock_sierra_client .close_connection .assert_called_once ()
118-
119- mock_redshift_client .connect .assert_called_once ()
120- mock_redshift_query .assert_called_once_with (
121- "patron_info_test_redshift_name" , "'obf_id1','obf_id4'"
122- )
123- mock_redshift_client .execute_query .assert_called_once_with ("REDSHIFT QUERY" )
124- mock_redshift_client .close_connection .assert_called_once ()
108+ mock_get_sierra_patron_data_from_barcodes .assert_called_once ()
109+ sierra_args = mock_get_sierra_patron_data_from_barcodes .call_args [0 ]
110+ assert sierra_args [0 ] == mock_sierra_client
111+ assert_series_equal (
112+ sierra_args [1 ],
113+ pd .Series (["barcode1" , "25555000000000" , "barcode3" , "barcode4" ],
114+ name = "barcode" , dtype = "string" ))
115+
116+ mock_get_redshift_patron_data .assert_called_once ()
117+ redshift_args = mock_get_redshift_patron_data .call_args [0 ]
118+ assert redshift_args [0 ] == mock_redshift_client
119+ assert_series_equal (
120+ redshift_args [1 ],
121+ pd .Series (["obf_id1" , "obf_id4" ], name = "patron_id" , index = [0 , 3 ]))
125122
126123 mock_obfuscate .assert_has_calls (
127124 [
@@ -152,8 +149,6 @@ def test_main_multiple_iterations(self, mock_helpers, mocker):
152149 "staff_override{}" .format (i ))
153150 for i in range (1 , 7 )]
154151 mocker .patch ("main.obfuscate" )
155- mocker .patch ("main.build_sierra_query" )
156- mocker .patch ("main.build_redshift_query" )
157152 mocker .patch ("main.AvroEncoder" )
158153 mocker .patch ("main.KinesisClient" )
159154 mocker .patch ("main.PostgreSQLClient" )
@@ -194,14 +189,15 @@ def test_main_no_envisionware_results(self, mock_helpers, mocker):
194189 del os .environ ["MAX_BATCHES" ]
195190 mocker .patch ("main.obfuscate" )
196191 mocker .patch ("main.build_envisionware_query" )
197- mocker .patch ("main.build_sierra_query" )
198- mocker .patch ("main.build_redshift_query" )
192+ mocker .patch ("main.PostgreSQLClient" )
193+ mocker .patch ("main.RedshiftClient" )
194+ mock_get_sierra_patron_data_from_barcodes = mocker .patch (
195+ "main.get_sierra_patron_data_from_barcodes" )
196+ mock_get_redshift_patron_data = mocker .patch ("main.get_redshift_patron_data" )
199197
200198 mock_s3_client = self ._set_up_mock ("main.S3Client" , mocker )
201199 mock_kinesis_client = self ._set_up_mock ("main.KinesisClient" , mocker )
202200 mock_avro_encoder = self ._set_up_mock ("main.AvroEncoder" , mocker )
203- mock_sierra_client = self ._set_up_mock ("main.PostgreSQLClient" , mocker )
204- mock_redshift_client = self ._set_up_mock ("main.RedshiftClient" , mocker )
205201
206202 mock_envisionware_client = self ._set_up_mock ("main.MySQLClient" , mocker )
207203 mock_envisionware_client .execute_query .return_value = []
@@ -213,13 +209,13 @@ def test_main_no_envisionware_results(self, mock_helpers, mocker):
213209 mock_s3_client .close .assert_called_once ()
214210 mock_kinesis_client .close .assert_called_once ()
215211
216- mock_sierra_client . connect .assert_not_called ()
217- mock_redshift_client . connect .assert_not_called ()
212+ mock_get_sierra_patron_data_from_barcodes .assert_not_called ()
213+ mock_get_redshift_patron_data .assert_not_called ()
218214 mock_avro_encoder .encode_batch .assert_not_called ()
219215 mock_kinesis_client .send_records .assert_not_called ()
220216 mock_s3_client .set_cache .assert_not_called ()
221217
222- def test_main_no_sierra_results (self , mock_helpers , mocker ):
218+ def test_main_no_sierra_redshift_results (self , mock_helpers , mocker ):
223219 _TEST_ENVISIONWARE_DATA = [
224220 (i , "barcode{}" .format (i ), i , datetime (2023 , i , i , i , 0 , 0 ),
225221 "branch{}" .format (i ), "area{}" .format (i ),
@@ -236,24 +232,26 @@ def test_main_no_sierra_results(self, mock_helpers, mocker):
236232 for i in range (1 , 5 )]
237233
238234 mocker .patch ("main.build_envisionware_query" )
239- mocker .patch ("main.build_sierra_query" )
240- mocker .patch ("main.build_redshift_query" )
241235 mocker .patch ("main.KinesisClient" )
242236 mocker .patch ("main.S3Client" )
243237
244238 mock_obfuscate = mocker .patch ("main.obfuscate" , return_value = "obfuscated" )
239+ mocker .patch (
240+ "main.get_sierra_patron_data_from_barcodes" ,
241+ return_value = pd .DataFrame (
242+ [], columns = ["patron_id" , "barcode" , "ptype_code" , "pcode3" ,
243+ "patron_home_library_code" ]))
244+ mocker .patch (
245+ "main.get_redshift_patron_data" ,
246+ return_value = pd .DataFrame (
247+ [], columns = ["patron_id" , "postal_code" , "geoid" ]))
245248 mock_avro_encoder = self ._set_up_mock ("main.AvroEncoder" , mocker )
246- mock_redshift_client = self ._set_up_mock ("main.RedshiftClient" , mocker )
247249
248250 mock_envisionware_client = self ._set_up_mock ("main.MySQLClient" , mocker )
249251 mock_envisionware_client .execute_query .return_value = _TEST_ENVISIONWARE_DATA
250252
251- mock_sierra_client = self ._set_up_mock ("main.PostgreSQLClient" , mocker )
252- mock_sierra_client .execute_query .return_value = []
253-
254253 main .main ()
255254
256- mock_redshift_client .connect .assert_not_called ()
257255 mock_avro_encoder .encode_batch .assert_called_once_with (_RESULTS )
258256 mock_obfuscate .assert_has_calls (
259257 [
@@ -267,57 +265,3 @@ def test_main_no_sierra_results(self, mock_helpers, mocker):
267265 mocker .call ("barcode barcode4" ),
268266 ]
269267 )
270-
271- def test_main_no_redshift_results (self , mock_helpers , mocker ):
272- _TEST_ENVISIONWARE_DATA = [
273- (i , "barcode{}" .format (i ), i , datetime (2023 , i , i , i , 0 , 0 ),
274- "branch{}" .format (i ), "area{}" .format (i ),
275- "staff_override{}" .format (i ))
276- for i in range (1 , 5 )]
277- _TEST_SIERRA_DATA = [
278- ("barcode{}" .format (i ), i + 1 , i , i , "lib{}" .format (i ))
279- for i in range (1 , 5 )]
280- _RESULTS = [
281- {"patron_id" : "obfuscated" , "ptype_code" : i ,
282- "patron_home_library_code" : "lib{}" .format (i ), "pcode3" : i ,
283- "postal_code" : None , "geoid" : None , "key" : "obfuscated" ,
284- "minutes_used" : i , "transaction_et" : "2023-0{}-0{}" .format (i , i ),
285- "branch" : "branch{}" .format (i ), "area" : "area{}" .format (i ),
286- "staff_override" : "staff_override{}" .format (i ),
287- "patron_retrieval_status" : "found" }
288- for i in range (1 , 5 )]
289-
290- mocker .patch ("main.build_envisionware_query" )
291- mocker .patch ("main.build_sierra_query" )
292- mocker .patch ("main.build_redshift_query" )
293- mocker .patch ("main.KinesisClient" )
294- mocker .patch ("main.S3Client" )
295-
296- mock_obfuscate = mocker .patch ("main.obfuscate" , return_value = "obfuscated" )
297- mock_avro_encoder = self ._set_up_mock ("main.AvroEncoder" , mocker )
298- mock_redshift_client = self ._set_up_mock ("main.RedshiftClient" , mocker )
299-
300- mock_envisionware_client = self ._set_up_mock ("main.MySQLClient" , mocker )
301- mock_envisionware_client .execute_query .return_value = _TEST_ENVISIONWARE_DATA
302-
303- mock_sierra_client = self ._set_up_mock ("main.PostgreSQLClient" , mocker )
304- mock_sierra_client .execute_query .return_value = _TEST_SIERRA_DATA
305-
306- mock_redshift_client = self ._set_up_mock ("main.RedshiftClient" , mocker )
307- mock_redshift_client .execute_query .return_value = []
308-
309- main .main ()
310-
311- mock_avro_encoder .encode_batch .assert_called_once_with (_RESULTS )
312- mock_obfuscate .assert_has_calls (
313- [
314- mocker .call ("1" ),
315- mocker .call ("2" ),
316- mocker .call ("3" ),
317- mocker .call ("4" ),
318- mocker .call ("2" ),
319- mocker .call ("3" ),
320- mocker .call ("4" ),
321- mocker .call ("5" ),
322- ]
323- )
0 commit comments