class ProductServiceTest(unittest.TestCase):
    def setUp(self):
        self.product_service = ProductService()
        migration = MigrationExecutor()
        migration.start()

    def test_add_product(self):
        product = Product("test", "product test", "12311231256", 10)
        self.product_service.add(product)
        conn = sqlite3.connect("inventory")
        cursor = conn.execute("SELECT * FROM product WHERE name = ?",
                              [product.name])
        db_object = cursor.fetchone()
        conn.close()
        self.assertEqual(db_object[1], product.name)
        self.assertEqual(db_object[2], product.description)
        self.assertEqual(db_object[3], product.bar_code)
        self.assertEqual(db_object[4], product.qtd)

    def test_list_products(self):
        product = Product("test", "product test", "12311231256", 10)
        self.product_service.add(product)
        result = self.product_service.list()
        self.assertEqual(1, len(result))

    def tearDown(self):
        my_path = os.path.abspath(os.path.dirname(__file__))
        os.remove(os.path.join(my_path, "inventory"))
    def delete(self, _id):
        data = ProductService.delete_product(_id)

        if data.get('not_found'):
            return data, 404

        return data, 200
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('name',
                            type=str,
                            required=True,
                            help="name field cannot be left blank!")
        parser.add_argument('npc',
                            type=str,
                            required=True,
                            help="npc field cannot be left blank!")
        parser.add_argument('stock',
                            type=inputs.positive,
                            required=True,
                            help="stock field cannot be left blank!")
        parser.add_argument('price',
                            type=float,
                            required=True,
                            help="price field cannot be left blank!")
        data = parser.parse_args()

        data = ProductService.create_product(**data)
        if data.get('exists'):
            return data, 400
        elif data.get('error'):
            return data, 500

        return data, 201
    def get(self):
        kwargs = ProductList.parser.parse_args()
        order_by = kwargs.get('orderBy')
        search_by = kwargs.get('searchByName')
        page = kwargs.get('page')
        per_page = kwargs.get('per_page')

        data = ProductService.get_product_list(search_by, order_by, page,
                                               per_page)
        return data, 200
    def patch(self, _id):

        data = ProductService.give_like_product(_id)

        if data.get('not_found'):
            return data, 404
        elif data.get('error'):
            return data, 500

        return data, 200
    def patch(self, _id):
        kwargs = ProductBuy.parser.parse_args()
        data = ProductService.buy_product(_id, kwargs.get('quantity'))

        if data.get('not_found'):
            return data, 404
        elif data.get('stock_not_enough'):
            return data, 200
        elif data.get('error'):
            return data, 500

        return data, 200
    def patch(self, _id):

        parser = reqparse.RequestParser()
        parser.add_argument('name', type=str)
        parser.add_argument('npc', type=str)
        parser.add_argument('stock', type=inputs.positive)
        parser.add_argument('price', type=float)
        data = parser.parse_args()

        data = ProductService.update_product(_id, **data)

        if data.get('not_found'):
            return data, 404
        elif data.get('error'):
            return data, 500

        return data, 200
 def setUp(self):
     self.product_service = ProductService()
     migration = MigrationExecutor()
     migration.start()