func Test_bartender_should_handle_order_and_check_validity_into_redis_with_success(t *testing.T) {
	// given
	order := commons.Order{Id: 1, Quantity: 5, Type: commons.Beer, CallBackUrl: "http://some-callback.com"}
	bd, _ := json.Marshal(order)
	// prepare datum into redis
	c, _ := redis.Dial("tcp", redisAddr)
	defer c.Close()
	c.Do("SET", order.Id, string(bd))
	defer c.Do("DEL", order.Id)
	// start bartender
	startBartender(b)
	// when
	resp, err := http.Post("http://127.0.0.1:4343/orders", "application/json", bytes.NewBuffer(bd))
	assert.Nil(t, err)
	assert.NotNil(t, resp)
	assert.Equal(t, 200, resp.StatusCode)
	val, _ := c.Do("GET", order.Id)
	var upgOrder commons.Order
	unmErr := commons.UnmarshalOrderFromInterface(val, &upgOrder)
	if unmErr == nil {
		assert.Equal(t, order.Id, upgOrder.Id)
		assert.True(t, upgOrder.Valid)
	} else {
		t.Fatal(unmErr.Error())
	}
}
func (b *Bartender) doHandleOrder(w http.ResponseWriter, r *http.Request, order commons.Order) {
	log.Println(fmt.Sprintf("Bartender | receive one order : %s", order))
	c, redisErr := redis.Dial("tcp", b.redisAddr)
	defer c.Close()
	if redisErr != nil {
		log.Printf("An error happends : %s \n\r", redisErr.Error())
		w.WriteHeader(500)
		return
	}
	// check the existance of the order
	exist, existErr := c.Do("EXISTS", order.Id)
	if existErr != nil {
		log.Printf("An error happends : %s \n\r", existErr.Error())
		w.WriteHeader(500)
		return
	}
	if exist.(int64) != 1 {
		log.Printf("Any order founded for order %d \n\r", order.Id)
		w.WriteHeader(404)
		return
	}
	// get the existing order
	var existingOrder commons.Order
	data, getError := c.Do("GET", order.Id)
	if getError != nil {
		log.Printf("An error happends : %s \n\r", getError.Error())
		w.WriteHeader(500)
		return
	}
	// check that the order is not already validated
	commons.UnmarshalOrderFromInterface(data, &existingOrder)
	if existingOrder.Valid {
		// already validated
		log.Printf("Order with id %d is already validated \n\r", order.Id)
		w.WriteHeader(403)
		return
	}
	// register the validated
	existingOrder.Valid = true
	bd, marshalError := json.Marshal(existingOrder)
	if marshalError != nil {
		log.Printf("An error happends : %s \n\r", marshalError.Error())
		w.WriteHeader(500)
		return
	}
	d := time.Duration(int(math.Pow(float64(order.Type+1), 2.0))*order.Quantity) * time.Millisecond * 10
	log.Println(fmt.Sprintf("Bartender | wait for %d millisecond", d))
	time.Sleep(d)
	_, saveErr := c.Do("SET", existingOrder.Id, string(bd))
	if saveErr != nil {
		log.Printf("An error happends : %s \n\r", saveErr.Error())
		w.WriteHeader(500)
		return
	}
	log.Println(fmt.Sprintf("Bartender | order %s successfully registered", order))
	w.WriteHeader(200)
}
Esempio n. 3
0
func paymentEndPoint(w http.ResponseWriter, r *http.Request) {
	var order commons.Order
	var credit commons.Credit
	urlPart := strings.Split(r.URL.Path, "/")
	// todo test me
	if len(urlPart) < 3 {
		log.Printf("payment | An error happends. Not enought variable path. Expected 3, get %d \n\r", len(urlPart))
		w.WriteHeader(404)
		return
	}
	c, redisErr := redis.Dial("tcp", redisAddr)
	defer c.Close()
	// todo test me
	if redisErr != nil {
		log.Printf("payment | An error happends : %s \n\r", redisErr.Error())
		w.WriteHeader(500)
		return
	}
	// check the existance of the order
	exist, existErr := c.Do("EXISTS", urlPart[3])
	if existErr != nil {
		log.Printf("An error happends : %s \n\r", existErr.Error())
		w.WriteHeader(500)
		return
	}
	// todo test me
	if exist.(int64) != 1 {
		log.Printf("Any order founded for order %d \n\r", urlPart[3])
		w.WriteHeader(404)
		return
	}
	data, getError := c.Do("GET", urlPart[3])
	if getError != nil {
		log.Printf("An error happends : %s \n\r", getError.Error())
		w.WriteHeader(500)
		return
	}
	// check that the order is not already validated
	// todo test me
	commons.UnmarshalOrderFromInterface(data, &order)
	if !order.Valid {
		// not validated
		log.Printf("Order with id %d is not validated \n\r", order.Id)
		w.WriteHeader(403)
		return
	}
	c.Do("DEL", order.Id)
	// check the existance of the order
	existCredit, _ := c.Do("EXISTS", urlPart[2])
	// todo test me
	if existCredit.(int64) != 1 {
		credit = commons.Credit{PlayerId: urlPart[2], Score: computePaymentSum(order), Timestamp: int(time.Now().UTC().Unix())}
	} else {
		dataCred, _ := c.Do("GET", urlPart[2])
		commons.UnmarshallCreditFromInterface(dataCred, &credit)
		credit.Score += computePaymentSum(order)
	}

	bd, _ := json.Marshal(credit)
	_, saveErr := c.Do("SET", credit.PlayerId, string(bd))
	if saveErr != nil {
		log.Printf("An error happends : %s \n\r", saveErr.Error())
		w.WriteHeader(500)
		return
	}
	log.Println(fmt.Sprintf("payment | credit %s successfully registered", credit))
	func() {
		ch <- commons.Notification{PlayerId: credit.PlayerId, Type: commons.Score, Score: credit.Score, Rate: float64(credit.Score) / float64((int(time.Now().UTC().Unix()) - credit.Timestamp))}
	}()
	w.WriteHeader(200)
}