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
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
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
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()
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"])
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
def setUp(self): """ This function is executed each time a new test function is executed """ self.api = Api()
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)