From 24c369b69e25da46bc3f6392c2ad603f2e381187 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 27 May 2025 20:46:03 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20can=5Frun=5Fbusiness=5Fday=5Fupdate?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/jskult_batch_status_manager.py | 14 +- ecs/jskult-batch/tests/__init__.py | 0 .../test_jskult_batch_status_manager.py | 393 ++++++++++++++++++ 3 files changed, 399 insertions(+), 8 deletions(-) create mode 100644 ecs/jskult-batch/tests/__init__.py diff --git a/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py b/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py index 9caeb0ec..92d97c5c 100644 --- a/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py +++ b/ecs/jskult-batch/src/manager/jskult_batch_status_manager.py @@ -135,6 +135,7 @@ class JskultBatchStatusManager: """ try: # 自身(後続処理 or 日付テーブル更新)のレコードを取得する + self._db.connect() record = self._db.execute_select( """ SELECT @@ -152,7 +153,7 @@ class JskultBatchStatusManager: record_count = len(record) if record_count == 0: - raise ValueError("レコードの取得が出来ませんでした。") + raise BatchOperationException("レコードの取得が出来ませんでした。") # 起動回数のインクリメント self._increment_run_count() @@ -227,8 +228,7 @@ class JskultBatchStatusManager: record = self._db.execute_select( """ SELECT - total_run_count, - process_status + total_run_count FROM internal07.jskult_batch_status_manage WHERE @@ -242,7 +242,6 @@ class JskultBatchStatusManager: raise BatchOperationException("レコードの取得が出来ませんでした。") total_run_count = record[0]['total_run_count'] - process_status = record[0]['process_status'] self._db.execute( """ @@ -250,7 +249,7 @@ class JskultBatchStatusManager: internal07.upsert_jskult_batch_status_manage( :process_name, :process_type, - :process_status, + NULL, :total_run_count, NULL ) @@ -258,7 +257,6 @@ class JskultBatchStatusManager: { 'process_name': self._process_name, 'process_type': self._process_type, - 'process_status': process_status, 'total_run_count': total_run_count + 1, } ) @@ -361,7 +359,7 @@ class JskultBatchStatusManager: internal07.jskult_batch_status_manage WHERE process_name = :process_name - AND process_status = process_status + AND process_status = :process_status AND process_date = src07.get_syor_date(); """, { @@ -426,7 +424,7 @@ class JskultBatchStatusManager: self._db.execute( """ CALL - upsert_jskult_batch_status_manage( + internal07.upsert_jskult_batch_status_manage( :process_name, :process_type, NULL, diff --git a/ecs/jskult-batch/tests/__init__.py b/ecs/jskult-batch/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ecs/jskult-batch/tests/manager/test_jskult_batch_status_manager.py b/ecs/jskult-batch/tests/manager/test_jskult_batch_status_manager.py index 3701dddc..10b64d08 100644 --- a/ecs/jskult-batch/tests/manager/test_jskult_batch_status_manager.py +++ b/ecs/jskult-batch/tests/manager/test_jskult_batch_status_manager.py @@ -3,6 +3,7 @@ import datetime import pytest from src.db.database import Database +from src.error.exceptions import MaxRunCountReachedException from src.manager.jskult_batch_status_manager import JskultBatchStatusManager @@ -204,3 +205,395 @@ class TestJskultBatchStatusManager: """)[0] assert actual_record['total_run_count'] == 1 + + def test_can_run_post_process_failed(self): + """ + 完了しているデータ取り込み件数と受信ファイル数が一致していない場合、falseが返却されること + 起動回数が+1されていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('unittest_process_name', '2025-05-30', 'unittest_process_type', + 'start', '0', '0'), + ('data_import_process_1', '2025-05-30','data_import', + 'done', '0', '0'), + ('data_import_process_2', '2025-05-30','data_import', + 'done', '0', '0'), + ('data_import_process_3', '2025-05-30','data_import', + 'done', '0', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'unittest_process_name', + 'unittest_process_type', + 3, + 4 + ) + actual = sut.can_run_post_process() + + # Assert + assert actual is False + actual_record = db.execute_select(""" + SELECT + total_run_count + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'unittest_process_name' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['total_run_count'] == 1 + + def test_can_run_post_process_raise_max_run_count_reached_exception(self): + """ + 完了しているデータ取り込み件数と受信ファイル数が一致していないかつ、最大起動回数に到達している場合、例外が送出されること + 最大起動回数フラグが1になっていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('unittest_process_name', '2025-05-30', 'unittest_process_type', + 'start', '2', '0'), + ('data_import_process_1', '2025-05-30','data_import', + 'done', '0', '0'), + ('data_import_process_2', '2025-05-30','data_import', + 'done', '0', '0'), + ('data_import_process_3', '2025-05-30','data_import', + 'done', '0', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'unittest_process_name', + 'unittest_process_type', + 3, + 4 + ) + with pytest.raises(MaxRunCountReachedException): + sut.can_run_post_process() + + # Assert + actual_record = db.execute_select(""" + SELECT + max_run_count_flg + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'unittest_process_name' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['max_run_count_flg'] == 1 + + def test_can_run_business_day_update_success(self): + """ + 後続処理3件が完了している場合、trueが返却されること + 起動回数が+1されていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('jskult-batch-business-day-update', '2025-05-30', 'update_business_day', + 'start', '0', '0'), + ('jskult-batch-trn-result-data-bio-lot', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-dcf-inst-merge-io', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-mst-inst-all', '2025-05-30','post_process', + 'done', '1', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'jskult-batch-business-day-update', + 'business_day_update', + 3, + 3 + ) + actual = sut.can_run_business_day_update() + + # Assert + assert actual is True + actual_record = db.execute_select(""" + SELECT + total_run_count + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'jskult-batch-business-day-update' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['total_run_count'] == 1 + + def test_can_run_business_day_update_failed_because_bio_lot_doing(self): + """ + 後続処理3件のうち、生物由来ロット分解が終了していない場合、falseが返却されること + 起動回数が+1されていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('jskult-batch-business-day-update', '2025-05-30', 'update_business_day', + 'start', '0', '0'), + ('jskult-batch-trn-result-data-bio-lot', '2025-05-30','post_process', + 'doing', '1', '0'), + ('jskult-batch-dcf-inst-merge-io', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-mst-inst-all', '2025-05-30','post_process', + 'done', '1', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'jskult-batch-business-day-update', + 'update_business_day', + 3, + 3 + ) + actual = sut.can_run_business_day_update() + + # Assert + assert actual is False + actual_record = db.execute_select(""" + SELECT + total_run_count + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'jskult-batch-business-day-update' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['total_run_count'] == 1 + + def test_can_run_business_day_update_failed_because_dcf_inst_merge_io_doing(self): + """ + 後続処理3件のうち、DCF削除新規マスタ作成が終了していない場合、falseが返却されること + 起動回数が+1されていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('jskult-batch-business-day-update', '2025-05-30', 'update_business_day', + 'start', '0', '0'), + ('jskult-batch-trn-result-data-bio-lot', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-dcf-inst-merge-io', '2025-05-30','post_process', + 'doing', '1', '0'), + ('jskult-batch-mst-inst-all', '2025-05-30','post_process', + 'done', '1', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'jskult-batch-business-day-update', + 'update_business_day', + 3, + 3 + ) + actual = sut.can_run_business_day_update() + + # Assert + assert actual is False + actual_record = db.execute_select(""" + SELECT + total_run_count + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'jskult-batch-business-day-update' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['total_run_count'] == 1 + + def test_can_run_business_day_update_failed_because_mst_inst_all_doing(self): + """ + 後続処理3件のうち、メルク施設マスタ作成が終了していない場合、falseが返却されること + 起動回数が+1されていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('jskult-batch-business-day-update', '2025-05-30', 'update_business_day', + 'start', '0', '0'), + ('jskult-batch-trn-result-data-bio-lot', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-dcf-inst-merge-io', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-mst-inst-all', '2025-05-30','post_process', + 'doing', '1', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'jskult-batch-business-day-update', + 'update_business_day', + 3, + 3 + ) + actual = sut.can_run_business_day_update() + + # Assert + assert actual is False + actual_record = db.execute_select(""" + SELECT + total_run_count + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'jskult-batch-business-day-update' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['total_run_count'] == 1 + + def test_can_run_business_day_update_raise_max_run_count_reached_exception(self): + """ + 後続処理3件のいずれかが終了していないかつ、最大起動回数に到達している場合、例外が送出されること + 最大起動回数フラグが1になっていること + """ + # Arrange + # 日付テーブルを登録 + db = Database.get_instance() + db.connect() + db.execute(""" + INSERT INTO src07.hdke_tbl + (syor_date, bch_actf, dump_sts_kbn, + creater, create_date, updater, update_date) + VALUES + ('20250530', '1', '2', CURRENT_USER(), CURRENT_TIMESTAMP(), NULL, NULL) + """) + + # バッチステータス管理テーブルを登録 + db.execute(""" + INSERT INTO internal07.jskult_batch_status_manage + (process_name, process_date, process_type, + process_status, total_run_count, max_run_count_flg) + VALUES + ('jskult-batch-business-day-update', '2025-05-30', 'update_business_day', + 'start', '2', '0'), + ('jskult-batch-trn-result-data-bio-lot', '2025-05-30','post_process', + 'doing', '1', '0'), + ('jskult-batch-dcf-inst-merge-io', '2025-05-30','post_process', + 'done', '1', '0'), + ('jskult-batch-mst-inst-all', '2025-05-30','post_process', + 'done', '1', '0') + """) + + # Act + sut = JskultBatchStatusManager( + 'jskult-batch-business-day-update', + 'update_business_day', + 3, + 4 + ) + with pytest.raises(MaxRunCountReachedException): + sut.can_run_business_day_update() + + # Assert + actual_record = db.execute_select(""" + SELECT + max_run_count_flg + FROM + internal07.jskult_batch_status_manage + WHERE + process_name = 'jskult-batch-business-day-update' + AND process_date = '2025-05-30' + """)[0] + + assert actual_record['max_run_count_flg'] == 1