Beispiel #1
0
    def fill_products(self):
        """
        This method fills database with products given by API
        """
        off = Api()
        results = off.get_request_response_from_api()
        with open("static/json/categories.json", "r", encoding="utf8") as file:
            categories_list = json.load(file)
        for category_dict in categories_list:
            for sub_category in category_dict["sub-category"]:
                products_of_category = results[sub_category]
                sub_cat = Category.objects.get(name=sub_category)
                for product_infos in products_of_category:
                    product = Product(
                        barcode=product_infos["_id"],
                        product_name=product_infos["product_name"],
                        brand=product_infos["brands"],
                        url_page=product_infos["url"],
                        image_url=product_infos["image_url"],
                        image_nutrition_url=product_infos[
                            "image_nutrition_url"],
                        nutrition_grade=product_infos["nutrition_grades"],
                        nutrition_score=product_infos["nutrition-score-fr"],
                        category=sub_cat)

                    with transaction.atomic():
                        try:
                            product.save(force_insert=True)
                        except IntegrityError:
                            pass
Beispiel #2
0
class TestApi(TestCase):
    """
    This class contains tests about API class
    """
    @classmethod
    def setUpTestData(cls):
        """
        This function is executed once at the beginning of test launching
        """
        pass

    def setUp(self):
        """
        This function is executed each time a new test function is executed
        """
        self.api = Api()

    @u.patch('builtins.open')
    @u.patch('json.load')
    def test_get_categories_list_from_json_return_list(self, mock_load,
                                                       mock_json):
        list_json = [{
            "category":
            "Produits laitiers",
            "sub-category":
            ["Laits", "Beurres", "Boissons lactées", "Fromages"]
        }, {
            "category":
            "Boissons",
            "sub-category":
            ["Sodas", "Boissons au thé", "Boissons énergisantes"]
        }]

        mock_load.return_value = mock_load.return_value = list_json
        self.assertEqual(self.api.get_categories_list_from_json(), list_json)

    @u.patch('openfoodfacts.api.Api.retrieve_informations_from_products')
    @u.patch('requests.Response')
    @u.patch('requests.get')
    @u.patch('builtins.open')
    @u.patch('json.load')
    def test_get_request_response_from_api_works(self, mock_load, mock_open,
                                                 mock_requests_get,
                                                 MockResponse, mock_retrieve):
        list_json = [{
            "category":
            "Produits laitiers",
            "sub-category":
            ["Laits", "Beurres", "Boissons lactées", "Fromages"]
        }]

        mock_load.return_value = list_json
        # {"products" : [{"_id" : 123, "product_name" : "Lactel"}]}
        mock_requests_get.return_value = MockResponse
        MockResponse.status_code = 200
        MockResponse.json.return_value = {
            "products": [{
                "_id": 123,
                "product_name": "Lactel"
            }]
        }
        mock_retrieve.return_value = [{"_id": 123, "product_name": "Lactel"}]
        self.assertEqual(
            self.api.get_request_response_from_api(), {
                "Laits": [{
                    "_id": 123,
                    "product_name": "Lactel"
                }],
                "Beurres": [{
                    "_id": 123,
                    "product_name": "Lactel"
                }],
                "Boissons lactées": [{
                    "_id": 123,
                    "product_name": "Lactel"
                }],
                "Fromages": [{
                    "_id": 123,
                    "product_name": "Lactel"
                }],
            })

    def test_retrieve_informations_from_product(self):
        products_list = [{
            "_id": "123",
            "donnee_inutile": "valeur",
            "nutrition_grades": "a",
            "product_name": "lactel",
            "url": "www.test.com",
            "brands": "lactalis",
            "nutriments": {
                "nutrition-score-fr": "5"
            },
            "image_url": "www.test-image.com",
            "image_nutrition_url": "www.test-nutrition-url"
        }, {
            "_id": "1234",
            "donnee_inutile": "valeur",
            "nutrition_grades": "b",
            "product_name": "lactel-bio",
            "url": "www.test.com",
            "brands": "lactalis-bio",
            "nutriments": {
                "nutrition-score-fr": "3"
            },
            "image_url": "www.test-image.com",
            "image_nutrition_url": "www.test-nutrition-url"
        }]

        parsed = [{
            "_id": "123",
            "nutrition_grades": "a",
            "product_name": "lactel",
            "url": "www.test.com",
            "brands": "lactalis",
            "nutrition-score-fr": "5",
            "image_url": "www.test-image.com",
            "image_nutrition_url": "www.test-nutrition-url"
        }, {
            "_id": "1234",
            "nutrition_grades": "b",
            "product_name": "lactel-bio",
            "url": "www.test.com",
            "brands": "lactalis-bio",
            "nutrition-score-fr": "3",
            "image_url": "www.test-image.com",
            "image_nutrition_url": "www.test-nutrition-url"
        }]
        self.assertEqual(
            self.api.retrieve_informations_from_products(products_list),
            parsed)