def test_invalid_chars_optimizer_does_nothing_when_title_and_description_do_not_exist(
            self):
        original_data = requests_bodies.build_request_body(
            properties_to_be_removed=['title', 'description'])
        optimizer = invalid_chars_optimizer.InvalidCharsOptimizer()

        _, optimization_result = optimizer.process(original_data)

        self.assertEqual(0, optimization_result.num_of_products_optimized)
    def test_invalid_chars_optimizer_does_nothing_when_all_chars_valid(self):
        title_with_no_invalid_chars = 'Brand 150g Product Desc'
        original_data = requests_bodies.build_request_body(
            properties_to_be_updated={'title': title_with_no_invalid_chars})
        optimizer = invalid_chars_optimizer.InvalidCharsOptimizer()

        optimized_data, optimization_result = optimizer.process(original_data)
        product = optimized_data['entries'][0]['product']

        self.assertEqual(title_with_no_invalid_chars, product['title'])
        self.assertEqual(0, optimization_result.num_of_products_optimized)
    def test_invalid_chars_optimizer_removes_last_char_in_unicode_private_area(
            self):
        title_with_last_char_in_unicode_private_area = (
            f'Brand 150g{chr(0xF8FF)} '
            f'Product Desc')
        original_data = requests_bodies.build_request_body(
            properties_to_be_updated={
                'title': title_with_last_char_in_unicode_private_area
            })
        optimizer = invalid_chars_optimizer.InvalidCharsOptimizer()

        optimized_data, optimization_result = optimizer.process(original_data)
        product = optimized_data['entries'][0]['product']

        self.assertEqual('Brand 150g Product Desc', product['title'])
        self.assertEqual(1, optimization_result.num_of_products_optimized)
    def test_invalid_chars_optimizer_sets_product_tracking_field_to_sanitized_when_invalid_char_removed(
            self):
        # Char in pos 10 is invalid
        title_with_single_invalid_char = 'Brand 150g Product Desc'
        original_data = requests_bodies.build_request_body(
            properties_to_be_updated={'title': title_with_single_invalid_char})
        optimizer = invalid_chars_optimizer.InvalidCharsOptimizer()
        tracking_field = 'customLabel4'

        with mock.patch.dict('os.environ',
                             {'PRODUCT_TRACKING_FIELD': tracking_field}):
            optimized_data, _ = optimizer.process(original_data)
            product = optimized_data['entries'][0]['product']

            self.assertEqual(enums.TrackingTag.SANITIZED.value,
                             product[tracking_field])
    def test_invalid_chars_optimizer_removes_multiple_invalid_chars(self):
        # Chars in pos 10 & pos 11 are invalid
        title_with_multiple_invalid_chars = 'Brand 150g Product Title'
        desc_with_multiple_invalid_chars = 'Brand 150g Product Desc'
        original_data = requests_bodies.build_request_body(
            properties_to_be_updated={
                'title': title_with_multiple_invalid_chars,
                'description': desc_with_multiple_invalid_chars
            })
        optimizer = invalid_chars_optimizer.InvalidCharsOptimizer()

        optimized_data, optimization_result = optimizer.process(original_data)
        product = optimized_data['entries'][0]['product']

        self.assertEqual('Brand 150g Product Title', product['title'])
        self.assertEqual('Brand 150g Product Desc', product['description'])
        self.assertEqual(1, optimization_result.num_of_products_optimized)