Пример #1
0
    def test_order_mail(self):
        with self.app.app_context():
            self.basic_setup()
            book2 = BooksModel(2, 2, 13.1, "book2")
            book2.save_to_db()

            isbns = [self.book.isbn, book2.isbn]
            prices = [self.book.precio, book2.precio]
            quantities = [1, 1]
            dataTransaction = {
                "isbns": isbns,
                'prices': prices,
                'quantities': quantities,
                "email": self.user.email,
            }
            res = self.client.post(
                "/api/transaction",
                data=dataTransaction,
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(201, res.status_code)
            # hi ha dues transaccions amb id 1
            transactions = TransactionsModel.find_by_id(1)
            self.assertEqual(len(transactions), 2)

            # les dues transaccions equivalen als llibres que acabem de posar
            for i, isbn in enumerate(isbns):
                self.assertEqual(
                    TransactionsModel.find_by_id_and_isbn(1, isbn).json(),
                    json.loads(res.data)['transactions'][i])
Пример #2
0
    def test_get_all_transactions(self):
        with self.app.app_context():
            self.basic_setup()
            book2 = BooksModel(2, 2, 13.1, "book2")
            book2.save_to_db()

            isbns = [self.book.isbn, book2.isbn]
            prices = [self.book.precio, book2.precio]
            quantities = [1, 1]
            TransactionsModel.save_transaction(self.user.id, isbns, prices,
                                               quantities)

            res = self.client.get(
                "/api/allTransactions",
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(200, res.status_code)

            allTransactions = TransactionsModel.query.all()
            for i, transaction in enumerate(allTransactions):
                self.assertEqual(transaction.json(),
                                 json.loads(res.data)['transactions'][0][i])
Пример #3
0
    def test_get_all_transactions_no_admin(self):
        with self.app.app_context():
            user = UsersModel("test",
                              "*****@*****.**",
                              role=Roles.User)
            user.hash_password("test")
            user.save_to_db()
            res = self.client.post("/api/login",
                                   data={
                                       "email": user.email,
                                       "password": "******"
                                   })
            token = json.loads(res.data)["token"]

            book = BooksModel(1, 1, 1, "book1")
            book.save_to_db()
            book2 = BooksModel(2, 2, 13.1, "book2")
            book2.save_to_db()

            isbns = [book.isbn, book2.isbn]
            prices = [book.precio, book2.precio]
            quantities = [1, 1]
            TransactionsModel.save_transaction(user.id, isbns, prices,
                                               quantities)

            res = self.client.get(
                "/api/allTransactions",
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(403, res.status_code)
Пример #4
0
    def test_model_add_no_stock(self):
        with self.app.app_context():
            self.basic_setup()
            book2 = BooksModel(2, 1, 1, "book2")
            book2.save_to_db()

            with self.assertRaises(Exception):
                TransactionsModel.save_transaction(self.user.id,
                                                   [self.book.isbn],
                                                   [self.book.precio], [100])
Пример #5
0
    def test_model_delete(self):
        with self.app.app_context():
            self.basic_setup()

            TransactionsModel.save_transaction(self.user.id, [self.book.isbn],
                                               [self.book.precio], [1])
            self.assertEqual(1, len(TransactionsModel.query.all()))

            TransactionsModel.query.filter_by(
                id_transaction=1).first().delete_from_db()
            self.assertEqual(0, len(TransactionsModel.query.all()))
Пример #6
0
    def test_model_invalid_update(self):
        with self.app.app_context():
            self.basic_setup()

            TransactionsModel.save_transaction(self.user.id, [self.book.isbn],
                                               [self.book.precio], [1])
            self.assertEqual(1, len(TransactionsModel.query.all()))

            data = {"id_transaction": 'string'}  # must be an integer
            with self.assertRaises(Exception):
                TransactionsModel.query.filter_by(
                    id_transaction=1).first().update_from_db(data)
Пример #7
0
    def test_model_add_some(self):
        with self.app.app_context():
            self.basic_setup()
            book2 = BooksModel(2, 1, 1, "book2")
            book2.save_to_db()

            expected = TransactionsModel.save_transaction(
                self.user.id, [self.book.isbn, book2.isbn],
                [self.book.precio, book2.precio], [1, 1])
            self.assertEqual(
                expected[0],
                TransactionsModel.find_by_id_and_isbn(1,
                                                      self.book.isbn).json())
            self.assertEqual(expected[1],
                             TransactionsModel.find_by_id_and_isbn(
                                 1, book2.isbn).json())  # same id
Пример #8
0
    def test_filter_transactions_by_user_id_and_date_desc(self):
        with self.app.app_context():
            self.basic_setup()
            self.add_transactions_user1()
            self.add_transactions_user2()

            res = self.client.get(
                "/api/allTransactions",
                data={
                    'user_id': self.user2.id,
                    'date': 'desc'
                },
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(200, res.status_code)

            transactions = TransactionsModel.query.filter_by(
                user_id=self.user2.id).order_by(desc('date')).all()
            expected_transactions = TransactionsModel.group_transactions_by_id(
                transactions)
            for i, transactions in enumerate(expected_transactions):
                for j, transaction in enumerate(transactions):
                    self.assertEqual(
                        transaction,
                        json.loads(res.data)['transactions'][i][j])
Пример #9
0
    def test_filter_transactions_by_isbn(self):
        with self.app.app_context():
            self.basic_setup()
            self.add_transactions_user1()  # has book with isbn = 1
            self.add_transactions_user2()  # has book with isbn = 1

            res = self.client.get(
                "/api/allTransactions",
                data={'isbn': self.book.isbn},
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(200, res.status_code)

            # the transactions with the books with isbn 1 are transactions 1 and 2
            ids_transactions = [1, 2]
            transactions = TransactionsModel.query.filter(
                TransactionsModel.id_transaction.in_(ids_transactions))
            expected_transactions = TransactionsModel.group_transactions_by_id(
                transactions)
            for i, transactions in enumerate(expected_transactions):
                for j, transaction in enumerate(transactions):
                    self.assertEqual(
                        transaction,
                        json.loads(res.data)['transactions'][i][j])
Пример #10
0
 def get(self, id_transaction):
     with lock:
         transaction = TransactionsModel.find_by_id(id_transaction)
         if not transaction:
             return {"message": f"Transaction with ['id_transaction':{id_transaction}] not found"}, 404
         if UsersModel.find_by_id(transaction.user_id) != g.user:
             return {"message": "Invalid transaction, can only be yours"}, 401
     return {"transaction": transaction.json()}, 200
Пример #11
0
 def get(self, email):
     with lock:
         user = UsersModel.find_by_email(email)
         if user is None:
             return {"message": "User with ['email': " + email + "] Not Found"}, 404
         if g.user != user:
             return {"message": "Invalid user, can only be yourself"}, 401
         transactions = TransactionsModel.query.filter_by(user_id=user.id).all()
         grouped_transactions = TransactionsModel.group_transactions_by_id(transactions)
         return {'transactions': grouped_transactions}, 200
Пример #12
0
    def get(self):
        with lock:
            parser = reqparse.RequestParser(bundle_errors=True)

            parser.add_argument('isbn', type=int, required=False,
                                help="In this field goes the isbn of the transactions")
            # parser.add_argument('titulo', type=str, required=False,
            # help="In this field goes the tittle of the book")
            parser.add_argument('user_id', type=int, required=False,
                                help="In this field goes the user_id of the transactions")
            parser.add_argument('date', type=str, required=False,
                                help="In this field goes the date order (asc, desc) of the transactions")
            data = parser.parse_args()

            transactions = TransactionsModel.query
            if not any(v is not None for k, v in data.items()):  # no filter asked
                grouped_transactions = TransactionsModel.group_transactions_by_id(transactions)
                return {'transactions': grouped_transactions}, 200
            else:
                if data['isbn'] is not None:
                    # Get transactions with isbn = isbn
                    transactions_containing_isbn = transactions.filter_by(isbn=data['isbn'])
                    # Ids of the transactions that have the isbn
                    ids_transactions = [t.id_transaction for t in transactions_containing_isbn]

                    # All transactions with the ids
                    transactions = TransactionsModel.query.filter(
                        TransactionsModel.id_transaction.in_(ids_transactions))
                if data['user_id'] is not None:
                    transactions = transactions.filter_by(user_id=data['user_id'])
                if data['date'] == str('asc'):
                    transactions = transactions.order_by(asc('date'))
                elif data['date'] == str('desc'):
                    transactions = transactions.order_by(desc('date'))

            grouped_transactions = TransactionsModel.group_transactions_by_id(transactions)
            return {'transactions': grouped_transactions}, 200
Пример #13
0
    def test_model_update(self):
        with self.app.app_context():
            self.basic_setup()

            TransactionsModel.save_transaction(self.user.id, [self.book.isbn],
                                               [self.book.precio], [1])
            self.assertEqual(1, len(TransactionsModel.query.all()))

            data = {"id_transaction": 10}  # id = 10
            TransactionsModel.query.filter_by(
                id_transaction=1).first().update_from_db(data)
            expected_output = {
                'date': dt.datetime.today().strftime("%d-%m-%Y"),
                'id_transaction': 10,
                'user_id': 1,
                'isbn': self.book.isbn,
                'price': self.book.precio,
                'book': self.book.json(),
                'quantity': 1
            }

            self.assertEqual(
                expected_output,
                TransactionsModel.find_by_id(data["id_transaction"])[0].json())
Пример #14
0
    def test_get_transactions_user(self):
        with self.app.app_context():
            self.basic_setup()
            book2 = BooksModel(2, 2, 13.1, "book2")
            book2.save_to_db()

            isbns = [self.book.isbn, book2.isbn]
            prices = [self.book.precio, book2.precio]
            quantities = [1, 1]
            dataTransaction = {
                "isbns": isbns,
                'prices': prices,
                'quantities': quantities,
                "email": self.user.email,
            }

            res = self.client.post(
                "/api/transaction",
                data=dataTransaction,
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(201, res.status_code)

            res = self.client.get(
                f"/api/transactions/{self.user.email}",
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(200, res.status_code)
            # l'usuari te dues transactions
            self.assertEqual(2, len(self.user.transactions))

            # comprovem que son les que hem acabat d'afegir
            expected = [
                transaction.json()
                for transaction in TransactionsModel.find_by_id(1)
            ]
            real_output = [
                transaction.json() for transaction in self.user.transactions
            ]
            self.assertEqual(expected, real_output)
Пример #15
0
    def get(self):
        parser = reqparse.RequestParser(bundle_errors=True)
        parser.add_argument(
            'numBooks',
            type=int,
            required=False,
            help="In this field goes the number of the books to show")
        data = parser.parse_args()
        isbns = TransactionsModel.best_sellers()

        return {
            'books':
            list(
                islice(
                    filter(
                        lambda book: book['vendible'],
                        map(
                            lambda x: BooksModel.find_by_isbn(x).json(
                                score=True), isbns)), data['numBooks']))
        }, 200
Пример #16
0
 def post(self):
     data = parse_transaction()
     with lock:
         user = UsersModel.find_by_email(data['email'])
         if user is None:
             return {"message": f"User with ['email': {data['email']}] Not Found"}, 404
         if user != g.user:
             return {"message": "Invalid transaction, can only post yours"}, 401
         for isbn, quantity in zip(data['isbns'], data['quantities']):
             book = BooksModel.find_by_isbn(isbn)
             if book is None:
                 return {"message": "Book with ['isbn': " + str(isbn) + "] Not Found"}, 404
             if quantity > book.stock:
                 return {"message": "Not enough stock for book with 'isbn': " + str(isbn) + "only "
                                    + str(book.stock) + " available"}, 404
         try:
             transactions = TransactionsModel.save_transaction(user.id, data['isbns'], data['prices'],
                                                               data['quantities'])
         except Exception as ex:
             return {'message': str(ex)}, 500
     return {'transactions': transactions}, 201
Пример #17
0
    def test_get_best_sellers(self):
        with self.app.app_context():
            self.basic_setup()

            isbns = [self.book.isbn, self.book2.isbn]
            prices = [self.book.precio, self.book2.precio]
            quantities = [1, 50]
            dataTransaction = {
                "isbns": isbns,
                'prices': prices,
                'quantities': quantities,
                "email": self.user.email,
            }
            res = self.client.post(
                "/api/transaction",
                data=dataTransaction,
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(201, res.status_code)
            # hi ha dues transaccions amb id 1
            transactions = TransactionsModel.find_by_id(1)
            self.assertEqual(len(transactions), 2)

            args = {
                "numBooks": 2,
            }
            res = self.client.get('/api/trending', data=args)
            self.assertEqual(200, res.status_code)

            self.assertEqual(
                2, len(json.loads(res.data)
                       ['books']))  # veiem que n'hi ha dos com li hem demanat
            self.assertEqual(self.book2.isbn,
                             json.loads(res.data)['books'][0]
                             ['isbn'])  # el més venut és el llibre amb isbn 2
Пример #18
0
    def test_get_all_transactions_no_filter(self):
        with self.app.app_context():
            self.basic_setup()
            self.add_transactions_user1()
            self.add_transactions_user2()

            res = self.client.get(
                "/api/allTransactions",
                headers={
                    "Authorization":
                    'Basic ' + base64.b64encode(
                        (self.token + ":").encode('ascii')).decode('ascii')
                })
            self.assertEqual(200, res.status_code)

            transactions = TransactionsModel.query.all()
            expected_transactions = TransactionsModel.group_transactions_by_id(
                transactions)
            for i, transactions in enumerate(expected_transactions):
                for j, transaction in enumerate(transactions):
                    self.assertEqual(
                        transaction,
                        json.loads(res.data)['transactions'][i][j])
Пример #19
0
 def add_transactions_user2(self):
     isbns = [self.book.isbn, self.book2.isbn]
     prices = [self.book.precio, self.book2.precio]
     quantities = [3, 1]
     TransactionsModel.save_transaction(self.user2.id, isbns, prices,
                                        quantities)