// CreateTransactionHandler creates a transaction from the json body data func CreateTransactionHandler(w http.ResponseWriter, request *http.Request) { userID := context.Get(request, "currentId").(string) body, err := JSONBodyParser(request) if err != nil { log.Fatal(err) w.WriteHeader(http.StatusBadRequest) return } vars := mux.Vars(request) accountID := body["accountId"].(string) label := body["label"].(string) value, ok := body["value"].(float64) if ok != true { w.WriteHeader(http.StatusBadRequest) return } categoryID := body["categoryId"].(string) if ok != true || accountID == "" || label == "" || accountID != vars["accountID"] || categoryID == "" { w.WriteHeader(http.StatusBadRequest) return } if isLink, err := models.IsLinkUserAccount(userID, accountID); err != nil || isLink != true { w.WriteHeader(http.StatusUnauthorized) return } var information string if body["information"] != nil { information = body["information"].(string) } transaction := models.Transaction{ Label: label, Date: time.Now(), Information: information, Value: value, Validate: false, AccountID: accountID, CategoryID: categoryID, } _, err = models.CreateTransaction(&transaction) if err != nil { log.Fatal(err) w.WriteHeader(http.StatusInternalServerError) return } if err = json.NewEncoder(w).Encode(transaction); err != nil { log.Fatal(err) w.WriteHeader(http.StatusInternalServerError) } }
func TestTransaction(t *testing.T) { //load mock values defer models.Db.Exec("DELETE FROM users") defer models.Db.Exec("DELETE FROM account") defer models.Db.Exec("DELETE FROM users_account") defer models.Db.Exec("DELETE FROM category") defer models.Db.Exec("DELETE FROM transaction") if err := models.ExecSQLScript("test_transaction.sql"); err != nil { panic(err) } transactionLabel := "label" transactionValue := -120.0 accountID := "3fd155dc-7a6f-4bac-a74b-902df936ed75" categoryID := "fe36bfe6-bf22-45fe-babd-a3db9d324727" testDate := time.Now() transaction := models.Transaction{ Label: transactionLabel, Date: testDate, Value: transactionValue, Validate: false, AccountID: accountID, CategoryID: categoryID, } _, err := models.CreateTransaction(&transaction) if err != nil { t.Errorf("Error unable to create transaction : %s", err) } transactions, err := models.FindTransactionsForAccount(accountID, 0, 10) if err != nil { t.Errorf("Error unable to fetch transactions : %s", err) } if len(transactions) != 1 { t.Errorf("Count transactions failed %d != 1", len(transactions)) return } if transactions[0].Label != transactionLabel { t.Errorf("Bad transaction label '%s'", transactions[0].Label) } if transactions[0].Value != transactionValue { t.Errorf("Bad transaction label '%s'", transactions[0].Value) } if transactions[0].Date.Equal(testDate) { t.Errorf("Bad transaction label '%s' vs '%s'", transactions[0].Date, testDate) } //Test trigger rows, err := models.Db.Query("SELECT value FROM account") if err != nil { t.Error(err) return } if rows.Next() { var value float64 err := rows.Scan(&value) if err != nil { t.Error(err) return } if value != -20.0 { t.Errorf("Error trigger : %f != -20.0", value) } } else { t.Errorf("bad query") } }