예제 #1
0
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)
예제 #2
0
 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")
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
 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)
예제 #6
0
 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)
예제 #7
0
 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)
예제 #8
0
 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)
예제 #9
0
 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)
예제 #10
0
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)
예제 #11
0
 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)