def test_insert_into_kpi_scene_results(self): """ test that the score are as expected """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = [{'pk': 101, 'display_group': 5, 'product_fk': 252, 'facings': 0.84, 'product_size': 1.23}, {'pk': 121, 'display_group': 4, 'product_fk': 132, 'facings': 0.80, 'product_size': 0.99}, {'pk': 201, 'display_group': 4, 'product_fk': 132, 'facings': 0.28, 'product_size': 0.75}, {'pk': 151, 'display_group': 5, 'product_fk': 252, 'facings': 0.95, 'product_size': 0.15}] scene_tool_box.get_display_group = MagicMock() scene_tool_box.get_display_group.return_value = 1 scene_tool_box.common.write_to_db_result = MagicMock() scene_tool_box.insert_into_kpi_scene_results(data) kpi_results = scene_tool_box.common.write_to_db_result.mock_calls result = kpi_results[1][2]['result'] expected_result = 1.23 + 0.15 score = kpi_results[1][2]['score'] expected_score = 0.84 + 0.95 self.assertEqual(result, expected_result) self.assertEqual(score, expected_score)
def test_save_nlsos_as_kpi_results(self): """ test that the score and result are as expected """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = [{'gross_len_split_stack_new': 13, 'product_type': 'Irrelevant', 'product_fk': None, 'rlv_sos_sc': 0, 'gross_len_split_stack': 0.15}, {'gross_len_split_stack_new': 65, 'product_type': '', 'product_fk': 252, 'rlv_sos_sc': 1, 'gross_len_split_stack': 1.23}, {'gross_len_split_stack_new': 35, 'product_type': '', 'product_fk': 253, 'rlv_sos_sc': 1, 'gross_len_split_stack': 1.23}, {'gross_len_split_stack_new': 121, 'product_type': 'Irrelevant', 'product_fk': 132, 'rlv_sos_sc': 0, 'gross_len_split_stack': 0.99}, {'gross_len_split_stack_new': 201, 'product_type': 'Irrelevant', 'product_fk': 132, 'rlv_sos_sc': 0, 'gross_len_split_stack': 0.75}, {'gross_len_split_stack_new': 13, 'product_type': '', 'product_fk': 272, 'rlv_sos_sc': 0, 'gross_len_split_stack': 0.15}] scene_tool_box.common.write_to_db_result = MagicMock() scene_tool_box.save_nlsos_as_kpi_results(pd.DataFrame(data)) kpi_results = scene_tool_box.common.write_to_db_result.mock_calls result = kpi_results[0][2]['score'] expected_result = 65.0 self.assertEqual(result, expected_result)
def test_calculate_display_size_correct_results_length(self): """ test result length """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) mock_df_products_size = self.mock_object('_get_display_size_of_product_in_scene', path='Projects.PNGCN_PROD.SceneKpis.KPISceneToolBox.PngcnSceneKpis') # test that we don't return any thing when the used df is empty mock_df_products_size.return_value = pd.DataFrame( [{'item_id': 2, 'scene_id': 3, 'product_size': 0.25}]) # test that we write the correct results to DB data_scif = [{u'scene_id': 16588190, u'item_id': 123, u'manufacturer_fk': 4, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 125, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 136, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}] scene_tool_box.scif = pd.DataFrame(data_scif) data_df_products_size = [{'item_id': 123, 'scene_id': 16588190, 'product_size': 1.245}, {'item_id': 124, 'scene_id': 16588190, 'product_size': 0.285}, {'item_id': 125, 'scene_id': 16588190, 'product_size': 1.225}, {'item_id': 126, 'scene_id': 16588190, 'product_size': 0.232}, {'item_id': 136, 'scene_id': 16588190, 'product_size': 0}] mock_df_products_size.return_value = pd.DataFrame(data_df_products_size) scene_tool_box.common.write_to_db_result = MagicMock() # scene_tool_box.png_manufacturer_fk = 4 scene_tool_box.calculate_display_size() kpi_results = scene_tool_box.common.write_to_db_result.mock_calls[0][2] if kpi_results: # test that we write 8 fields to DB self.assertEqual(len(kpi_results), 8, 'expects to write 8 parameters to db')
def test_calculate_display_size_correct_results_sanity(self): """ test if the numerator is greater then denominator (if the subgroup is greater then containing group) """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) mock_df_products_size = self.mock_object('_get_display_size_of_product_in_scene', path='Projects.PNGCN_PROD.SceneKpis.KPISceneToolBox.PngcnSceneKpis') # test that we write the correct results to DB data_scif = [{u'scene_id': 16588190, u'item_id': 123, u'manufacturer_fk': 4, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 125, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 136, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}] scene_tool_box.scif = pd.DataFrame(data_scif) data_df_products_size = [{'item_id': 123, 'scene_id': 16588190, 'product_size': 1.245}, {'item_id': 124, 'scene_id': 16588190, 'product_size': 0.285}, {'item_id': 125, 'scene_id': 16588190, 'product_size': 1.225}, {'item_id': 126, 'scene_id': 16588190, 'product_size': 0.232}, {'item_id': 136, 'scene_id': 16588190, 'product_size': 0}] mock_df_products_size.return_value = pd.DataFrame(data_df_products_size) scene_tool_box.common.write_to_db_result = MagicMock() scene_tool_box.calculate_display_size() kpi_results = scene_tool_box.common.write_to_db_result.mock_calls[0][2] if kpi_results: numerator = kpi_results['numerator_result'] denominator = kpi_results['denominator_result'] # test if the numerator is greater then denominator (if the subgroup is greater then containing group) self.assertGreaterEqual(denominator, numerator, 'the numerator cant be greater then denominator')
def test_calculate_facing_eye_level(self): scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = pd.DataFrame( [{'scene_fk': 16588190, 'manufacturer_name': 'P&G\xe5\xae\x9d\xe6\xb4\x81', 'brand_name': 'Safeguard', 'category': 'Personal Cleaning Care', 'product_fk': 152, 'stacking_layer': 1, 'category_fk': 101, 'bay_number': 1, 'shelf_number': 1, 'facing_sequence_number': 3, 'sub_category': 'Handwash'}, {'scene_fk': 16588190, 'manufacturer_name': 'P&G\xe5\xae\x9d\xe6\xb4\x81', 'brand_name': 'Safeguard', 'category': 'something', 'product_fk': 152, 'stacking_layer': 2, 'category_fk': 101, 'bay_number':1, 'shelf_number':2, 'facing_sequence_number': 3, 'sub_category': 'Handwash'}, {'scene_fk': 16588190, 'manufacturer_name': 'P&G\xe5\xae\x9d\xe6\xb4\x81', 'brand_name': 'Safeguard', 'category': 'Personal Cleaning Care', 'product_fk': 152, 'stacking_layer': 1, 'category_fk': 102, 'bay_number': 2, 'shelf_number': 2, 'facing_sequence_number': 1, 'sub_category': 'Bodywash'}, {'scene_fk': 16588190, 'manufacturer_name': 'P&G\xe5\xae\x9d\xe6\xb4\x81', 'brand_name': 'Safeguard', 'category': 'Personal Cleaning Care', 'product_fk': 152, 'stacking_layer': 1, 'category_fk': 101, 'bay_number': 2, 'shelf_number': 2, 'facing_sequence_number': 3, 'sub_category': 'Handwash'}, {'scene_fk': 16588190, 'manufacturer_name': 'P&G\xe5\xae\x9d\xe6\xb4\x81', 'brand_name': 'hola', 'category': 'Personal Cleaning Care', 'product_fk': 152, 'stacking_layer': 1, 'category_fk': 101, 'bay_number': 2, 'shelf_number': 2, 'facing_sequence_number': 2, 'sub_category': 'HOLA'}]) scene_tool_box.get_filterd_matches = MagicMock(return_value=pd.DataFrame(data)) scene_tool_box.common.write_to_db_result = MagicMock() scene_tool_box.calculate_facing_eye_level(data, 2) kpi_results = scene_tool_box.common.write_to_db_result.mock_calls if kpi_results: self.assertEqual(len(kpi_results), 2, 'expects to write 2 parameters to db') self.assertEqual(kpi_results[1][2]['result'], 4, "result isn't 4 although there are 4 facings in shelf 2") else: raise Exception('No results were saved')
def test_calculate_display_size_correct_results_type(self): """ test that the type of the numerator and denominator is float """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) mock_df_products_size = self.mock_object('_get_display_size_of_product_in_scene', path='Projects.PNGCN_PROD.SceneKpis.KPISceneToolBox.PngcnSceneKpis') # test that we don't return any thing when the used df is empty mock_df_products_size.return_value = pd.DataFrame( [{'item_id': 2, 'scene_id': 3, 'product_size': 0.25}]) # test that we write the correct results to DB data_scif = [{u'scene_id': 16588190, u'item_id': 123, u'manufacturer_fk': 4, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 125, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}, {u'scene_id': 16588190, u'item_id': 136, u'manufacturer_fk': 3, u'rlv_sos_sc': 1, u'status': 1}] scene_tool_box.scif = pd.DataFrame(data_scif) data_df_products_size = [{'item_id': 123, 'scene_id': 16588190, 'product_size': 1.245}, {'item_id': 124, 'scene_id': 16588190, 'product_size': 0.285}, {'item_id': 125, 'scene_id': 16588190, 'product_size': 1.225}, {'item_id': 126, 'scene_id': 16588190, 'product_size': 0.232}, {'item_id': 136, 'scene_id': 16588190, 'product_size': 0}] mock_df_products_size.return_value = pd.DataFrame(data_df_products_size) scene_tool_box.common.write_to_db_result = MagicMock() scene_tool_box.calculate_display_size() kpi_results = scene_tool_box.common.write_to_db_result.mock_calls[0][2] if kpi_results: numerator = kpi_results['numerator_result'] denominator = kpi_results['denominator_result'] # test that the type of the numerator and denominator is float self.assertIsInstance(denominator, float) self.assertIsInstance(numerator, float)
def test_calculate_presize_linear_length(self): """ test that the function returns 0 (finished as expected) """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) self.assertEquals(scene_tool_box.calculate_presize_linear_length(), 0)
def test__get_display_size_of_product_in_scene(self): """ test that the result is a DF """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) self.assertIsInstance(scene_tool_box._get_display_size_of_product_in_scene(), type(pd.DataFrame()))
def test__get_filterd_matches_test_type(self): """ test that the result is a DF """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) # test that the result is a DF df_type = scene_tool_box.get_filterd_matches() self.assertIsInstance(df_type, type(pd.DataFrame()))
def __init__(self, data_provider, output=None): self.data_provider = data_provider self.output = output self.project_name = data_provider.project_name self.session_uid = self.data_provider.session_uid self.scene_id = self.data_provider.scene_id self.common = Common(data_provider) self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng) self.scene_tool_box = PngcnSceneKpis(self.rds_conn, self.common, self.scene_id, self.data_provider)
def test_get_png_manufacturer_fk(self): """ test the result type """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) result = type(scene_tool_box.get_png_manufacturer_fk()) expected_result = int self.assertEqual(expected_result, result)
def test_calculate_result_type(self): """ test that the result is float """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) # test that the result is float numerator, denominator = 12, 15 result = type(scene_tool_box.calculate_result(numerator, denominator)) expected_result = float self.assertEqual(expected_result, result)
def test__get_filterd_matches_test_manufacturer_size(self): """ test that there is only one manufacturer fk in the return DF """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) # test that the result is a DF df_type = scene_tool_box.get_filterd_matches() # test that there is only one manufacturer fk in the return DF unique_fk = len(df_type['manufacturer_fk'].unique()) self.assertEqual(unique_fk, 1)
def test_calculate_result_sanity(self): """ test that function returns zero for denominator=0 """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) # test that function returns zero for denominator=0 numerator, denominator = 12, 0 result = scene_tool_box.calculate_result(numerator, denominator) expected_result = 0 self.assertEqual(expected_result, result)
def test_get_eye_level_shelves(self): scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = pd.DataFrame( [{'bay_number': 1, 'shelf_number': 3}, {'bay_number': 1, 'shelf_number': 3}, {'bay_number': 1, 'shelf_number': 6}, {'bay_number': 1, 'shelf_number': 6}, {'bay_number': 2, 'shelf_number': 2}, {'bay_number': 2, 'shelf_number': 4}, {'bay_number': 2, 'shelf_number': 10}, {'bay_number': 2, 'shelf_number': 9}, {'bay_number': 3, 'shelf_number': 1}, {'bay_number': 3, 'shelf_number': 1}, {'bay_number': 3, 'shelf_number': 2}, {'bay_number': 3, 'shelf_number': 2}]) scene_tool_box.get_filterd_matches = MagicMock(return_value=pd.DataFrame(data)) scene_tool_box.common.write_to_db_result = MagicMock() kpi_results = scene_tool_box.get_eye_level_shelves(data) self.assertEqual(len(kpi_results[kpi_results['bay_number'] == 3]), 4, 'expects to have 4 lines with bay number 3') self.assertTrue(kpi_results[kpi_results['bay_number'] == 1].empty, "Expected to have an empty df where bay number =1") # try blade & razor template blade_template_fk = 144 self.data_provider_mock['templates'] = pd.DataFrame([{'template_fk': 144}]) scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) scene_tool_box.get_filterd_matches = MagicMock(return_value=pd.DataFrame(data)) scene_tool_box.common.write_to_db_result = MagicMock() kpi_results = scene_tool_box.get_eye_level_shelves( data, psdataprovider=self.psdataprovider, template_fk=blade_template_fk) self.assertEqual(len(kpi_results[kpi_results['bay_number'] == 3]), 2, 'expects to have only 2 lines with bay number 3 since the eye level for blade is [2, 3]') self.assertEqual(len(kpi_results[kpi_results['bay_number'] == 2]), 1, 'expects to have only 1 line with bay number 2 since the eye level for blade is [2, 3]')
def test__get_filterd_matches_test_manufacturer_fk(self): """ test that the only manufacturer fk in DF is Png """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) # test that the result is a DF df_type = scene_tool_box.get_filterd_matches() # test that the only manufacturer fk in DF is Png png_fk = df_type['manufacturer_fk'].unique()[0] self.assertEqual(png_fk, 4)
def test_insert_data_into_custom_scif(self): """ test type delete qury type. """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) scene_tool_box.data_provider.session_id = 'ebebc629-6b82-4be8-a872-0caa248ea248' new_scif = pd.DataFrame(r.new_scif) scene_tool_box.common.execute_custom_query() scene_tool_box.insert_data_into_custom_scif(new_scif) delete_query = scene_tool_box.common.execute_custom_query.mock_calls[1][1][0] insert_query = scene_tool_box.common.execute_custom_query.mock_calls[2][1][0] self.assertIsInstance(delete_query, str) self.assertIsInstance(insert_query, str)
def test_calculate_display_size_empty_df(self): """ test that we don't return any thing when the used df is empty """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) scene_tool_box.mock_df_products_size = \ self.mock_object('_get_display_size_of_product_in_scene', path='Projects.PNGCN_PROD.SceneKpis.KPISceneToolBox.PngcnSceneKpis') # test that we don't return any thing when the used df is empty scene_tool_box.mock_df_products_size.return_value = pd.DataFrame({}) result = scene_tool_box.calculate_display_size() expected_result = None self.assertEqual(expected_result, result)
class SceneGenerator: def __init__(self, data_provider, output=None): self.data_provider = data_provider self.output = output self.project_name = data_provider.project_name self.session_uid = self.data_provider.session_uid self.scene_id = self.data_provider.scene_id self.common = Common(data_provider) self.rds_conn = PSProjectConnector(self.project_name, DbUsers.CalculationEng) self.scene_tool_box = PngcnSceneKpis(self.rds_conn, self.common, self.scene_id, self.data_provider) @log_runtime('Total Calculations', log_start=True) def PngcnSceneKpis(self): """ This is the main KPI calculation function. It calculates the score for every KPI set and saves it to the DB. """ self.scene_tool_box.process_scene()
def test_calculate_linear_or_presize_linear_length_test_results_length(self): """ test that we write 8 fields to DB """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = [{'scene_fk': 101, 'manufacturer_fk': 2, 'product_fk': 252, 'width_mm': 0.84, 'width_mm_advance': 1.23}, {'scene_fk': 121, 'manufacturer_fk': 4, 'product_fk': 132, 'width_mm': 0.80, 'width_mm_advance': 0.99}, {'scene_fk': 201, 'manufacturer_fk': 4, 'product_fk': 152, 'width_mm': 0.28, 'width_mm_advance': 0.75}, {'scene_fk': 151, 'manufacturer_fk': 5, 'product_fk': 172, 'width_mm': 0.95, 'width_mm_advance': 0.15}] scene_tool_box.get_filterd_matches = MagicMock(return_value=pd.DataFrame(data)) scene_tool_box.png_manufacturer_fk = 4 scene_tool_box.common.write_to_db_result = MagicMock() width = random.choice(['width_mm', 'width_mm_advance']) scene_tool_box.calculate_linear_or_presize_linear_length(width) kpi_results = scene_tool_box.common.write_to_db_result.mock_calls[0][2] if kpi_results: self.assertEqual(len(kpi_results), 8, 'expects to write 8 parameters to db')
def test_calculate_linear_or_presize_linear_length_test_results_sanity(self): """ test if the numerator is greater then denominator (if the subgroup is greater then containing group) """ scene_tool_box = PngcnSceneKpis(self.ProjectConnector_mock, self.common_mock, 16588190, self.data_provider_mock) data = [{'scene_fk': 101, 'manufacturer_fk': 2, 'product_fk': 252, 'width_mm': 0.84, 'width_mm_advance': 1.23}, {'scene_fk': 121, 'manufacturer_fk': 4, 'product_fk': 132, 'width_mm': 0.80, 'width_mm_advance': 0.99}, {'scene_fk': 201, 'manufacturer_fk': 4, 'product_fk': 152, 'width_mm': 0.28, 'width_mm_advance': 0.75}, {'scene_fk': 151, 'manufacturer_fk': 5, 'product_fk': 172, 'width_mm': 0.95, 'width_mm_advance': 0.15}] scene_tool_box.get_filterd_matches = MagicMock(return_value=pd.DataFrame(data)) scene_tool_box.png_manufacturer_fk = 4 scene_tool_box.common.write_to_db_result = MagicMock() width = random.choice(['width_mm', 'width_mm_advance']) scene_tool_box.calculate_linear_or_presize_linear_length(width) kpi_results = scene_tool_box.common.write_to_db_result.mock_calls[0][2] if kpi_results: numerator = kpi_results['numerator_result'] denominator = kpi_results['denominator_result'] self.assertGreaterEqual(denominator, numerator, 'the numerator cant be greater then denominator')