def list_promotions(): r""" Returns all of the Promotions Search the promotions in the database. <ul> <li>Only the first non-empty field will be considered.</li> <li>An empty query will result in a list of all promotion entries in the database</li> </ul> --- tags: - promotions produces: - application/json parameters: - name: name in: query description: name of the promotion required: false type: string - name: product_id in: query description: product_id for the promotion required: false type: integer minimum: 0 format: int32 - name: discount_ratio in: query description: discount ratio of the promotion required: false type: integer maximum: 100.0 minimum: 0 format: int32 responses: 200: description: search results matching criteria schema: type: array items: $ref: '#/definitions/ResponsePromotionObject' 400: description: bad input parameter """ promotions = [] promotion_id = request.args.get('promotion_id') name = request.args.get('name') product_id = request.args.get('product_id') discount_ratio = request.args.get('discount_ratio') if name: promotions = Promotion.find_by_name(name) elif product_id: promotions = Promotion.find_by_product_id(product_id) elif discount_ratio: promotions = Promotion.find_by_discount_ratio(discount_ratio) else: promotions = Promotion.all() results = [promotion.serialize() for promotion in promotions] return make_response(jsonify(results), status.HTTP_200_OK)
def test_find_by_name(self): """ Find a Promotion by Name """ Promotion(name="20%OFF", product_id=9527, discount_ratio=80).save() Promotion(name="50%OFF", product_id=26668).save() promotions = Promotion.find_by_name("20%OFF") self.assertEqual(promotions[0].product_id, 9527) self.assertEqual(promotions[0].name, "20%OFF")
def test_get_promotion(self): """ Get a single Promotion """ # get the promotion_id of a promotion promotion = Promotion.find_by_name('20%OFF')[0] resp = self.app.get('/promotions/{}'.format(promotion.promotion_id), content_type='application/json') self.assertEqual(resp.status_code, status.HTTP_200_OK) data = json.loads(resp.data) self.assertEqual(data['name'], promotion.name)
def test_redeem_promotions(self): """ Redeem a promotion """ for i in xrange(1, 20): promotion = Promotion.find_by_name('50%OFF')[0] resp = self.app.post('/promotions/{}/redeem'.format( promotion.promotion_id)) self.assertEqual(resp.status_code, status.HTTP_200_OK) resp = self.app.get('/promotions/{}'.format( promotion.promotion_id)) new_json = json.loads(resp.data) self.assertEqual(new_json['counter'], i)
def test_delete_promotion(self): """ Delete a Promotion """ promotion = Promotion.find_by_name('20%OFF')[0] # save the current number of promotions for later comparison promotion_count = self.get_promotion_count() resp = self.app.delete('/promotions/{}'.format(promotion.promotion_id), content_type='application/json') self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(len(resp.data), 0) new_count = self.get_promotion_count() self.assertEqual(new_count, promotion_count - 1)
def test_redeem_promotions_method_not_suported(self): """ Redeem a promotion with the wrong method """ promotion = Promotion.find_by_name('50%OFF')[0] resp = self.app.post('/promotions/{}/redeem'.format( promotion.promotion_id)) self.assertEqual(resp.status_code, status.HTTP_200_OK) resp = self.app.get('/promotions/{}/redeem'.format( promotion.promotion_id)) self.assertEqual(resp.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) resp = self.app.put('/promotions/{}/redeem'.format( promotion.promotion_id)) self.assertEqual(resp.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) resp = self.app.delete('/promotions/{}/redeem'.format( promotion.promotion_id)) self.assertEqual(resp.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
def test_partial_update_promotion_no_content(self): """ Partial update an existing Promotion with no update content """ promotion_count = self.get_promotion_count() promotion = Promotion.find_by_name('50%OFF')[0] promotion_id = promotion.promotion_id new_promotion = {} data = json.dumps(new_promotion) resp = self.app.put('/promotions/{}'.format(promotion_id), data=data, content_type='application/json') new_promotion_count = self.get_promotion_count() self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(promotion_count, new_promotion_count) self.assertEqual(promotion.name, "50%OFF") self.assertEqual(promotion.product_id, 26668) self.assertEqual(promotion.discount_ratio, 50)
def test_update_promotion_wrong_content_type(self): """ Update an existing Promotion with wrong input format""" promotion_count = self.get_promotion_count() promotion = Promotion.find_by_name('50%OFF')[0] promotion_id = promotion.promotion_id new_promotion = "{'name': '90%OFF', 'product_id': 2609, 'discount_ratio': 10}" data = json.dumps(new_promotion) resp = self.app.put('/promotions/{}'.format(promotion_id), data=data, content_type='application/plain') self.assertEqual(resp.status_code, status.HTTP_415_UNSUPPORTED_MEDIA_TYPE) new_promotion_count = self.get_promotion_count() self.assertEqual(promotion_count, new_promotion_count) self.assertEqual(promotion.name, "50%OFF") self.assertEqual(promotion.product_id, 26668) self.assertEqual(promotion.discount_ratio, 50)
def test_partial_update_promotion(self): """ Partial update an existing Promotion """ promotion_count = self.get_promotion_count() promotion = Promotion.find_by_name('50%OFF')[0] promotion_id = promotion.promotion_id new_promotion = {'name': '90%OFF', 'discount_ratio': 10} data = json.dumps(new_promotion) resp = self.app.put('/promotions/{}'.format(promotion_id), data=data, content_type='application/json') new_promotion_count = self.get_promotion_count() self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(promotion_count, new_promotion_count) new_json = json.loads(resp.data) self.assertEqual(new_json['promotion_id'], promotion_id) self.assertEqual(new_json['name'], '90%OFF') self.assertEqual(new_json['product_id'], 26668) self.assertEqual(new_json['discount_ratio'], 10)
def list_promotions(): """ Returns all of the Promotions """ promotions = [] promotion_id = request.args.get('promotion_id') name = request.args.get('name') product_id = request.args.get('product_id') discount_ratio = request.args.get('discount_ratio') if name: promotions = Promotion.find_by_name(name) elif product_id: promotions = Promotion.find_by_product_id(product_id) elif discount_ratio: promotions = Promotion.find_by_discount_ratio(discount_ratio) else: promotions = Promotion.all() results = [promotion.serialize() for promotion in promotions] return make_response(jsonify(results), status.HTTP_200_OK)
def test_update_promotion_bad_request_value_out_of_range(self): """ Update an existing Promotion with wrong value""" promotion_count = self.get_promotion_count() promotion = Promotion.find_by_name('50%OFF')[0] promotion_id = promotion.promotion_id new_promotion = { 'name': '90%OFF', 'product_id': 2609, 'discount_ratio': 200 } data = json.dumps(new_promotion) resp = self.app.put('/promotions/{}'.format(promotion_id), data=data, content_type='application/json') self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) new_promotion_count = self.get_promotion_count() self.assertEqual(promotion_count, new_promotion_count) self.assertEqual(promotion.name, "50%OFF") self.assertEqual(promotion.product_id, 26668) self.assertEqual(promotion.discount_ratio, 50)