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
def test_get_data(monkeypatch) -> None:
    """ Method testing data recovery via the OpenFoodFacts API """
    api: Api = Api()

    def mockreturn(*args, **kwargs):
        return MockResponse()

    monkeypatch.setattr(requests, "get", mockreturn)
    assert api.get_data("Boissons") == Config.OPENFOODFACTS_DATA
Beispiel #3
0
 def __init__(self, build_db) -> None:
     self.api: Api = Api()
     self.database: Database() = Database(
         environ['HOST'],
         environ['USER'],
         environ['PASSWORD'],
         environ['DATABASE'],
     )
     self.setup_database: SetupDatabase = SetupDatabase(self.database)
     self.clean_datas: DatasCleaner = DatasCleaner()
     self.populate: Populate = Populate(self.database)
     self.ui: Display = Display(self.database)
     self.build_database = build_db
Beispiel #4
0
    def test_api_with_not_found_error(self):
        data = {
            "products": [{
                "nutriscore_grade": "d",
                "code": "7622210449283",
                "url":
                "https://fr.openfoodfacts.org/produit/chocolat-au-ble-complet",
                "product_name": "Prince goût chocolat au blé complet",
            }]
        }
        mock_requests_get = MockRequests(data, 404).get

        with patch("openfoodfacts.api.requests.get", mock_requests_get):
            with self.assertRaises(HTTPError):
                Api().get_products()
Beispiel #5
0
    def test_api_return_products(self):
        data = {
            "products": [{
                "nutriscore_grade": "d",
                "code": "7622210449283",
                "url":
                "https://fr.openfoodfacts.org/produit/chocolat-au-ble-complet",
                "product_name": "Prince goût chocolat au blé complet",
            }]
        }
        mock_requests_get = MockRequests(data, 200).get

        mock_pages = 1

        with patch("openfoodfacts.api.Api.PAGES", mock_pages):
            with patch("openfoodfacts.api.requests.get", mock_requests_get):
                products = Api().get_products()

                self.assertEqual(products, data["products"])
Beispiel #6
0
    def handle(self, *args, **options):
        try:
            raw_products = Api().get_products()
        except HTTPError as err:
            if err.status_code == 404:
                self.stdout.write(
                    self.style.http_not_found(
                        "Could'nt reach Open Food Facts' API."))
            elif err.status_code == 500:
                message = """Something went wrong with Open Food Facts' servers,
                    please try again later."""

                self.stdout.write(self.style.http_server_error(message))
            else:
                self.stdout.write(
                    self.style.warning(
                        "Something went wrong with Open Food Facts'."))
        except ConnectionError:
            self.stdout.write(
                self.style.WARNING("Please check your connection."))
        except Timeout:
            self.stdout.write(self.style.WARNING("The request timed out."))
        else:
            FeedDb().feed_db(raw_products)
 def __init__(self, categories: List[str]) -> None:
     self.api: Api = Api()
     self.clean_datas: DataCleaner = DataCleaner()
     self.categories: List[str] = categories
Beispiel #8
0
 def setUp(self):
     """
     This function is executed each time a new test function is executed
     """
     self.api = Api()
Beispiel #9
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)