Skip to content

Commit

Permalink
test: add tests for network validation
Browse files Browse the repository at this point in the history
  • Loading branch information
sundayonah committed Feb 12, 2025
1 parent 4f73f1f commit 9e929e3
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 52 deletions.
1 change: 0 additions & 1 deletion controllers/sender/sender.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ func (ctrl *SenderController) InitiatePaymentOrder(ctx *gin.Context) {
Message: "Provided token is not supported",
})
} else {
// log.Errorf("Database error while validating token", err)
u.APIResponse(ctx, http.StatusInternalServerError, "error", "Internal server error", nil)
}
return
Expand Down
145 changes: 94 additions & 51 deletions controllers/sender/sender_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ func setup() error {
if err != nil {
return err
}

// console alikey and secretkey
fmt.Println(apiKey, " api key ")
fmt.Println(secretKey, " secret key ")

testCtx.apiKey = apiKey

testCtx.token = token
Expand All @@ -111,7 +116,7 @@ func TestSender(t *testing.T) {

// Set up test database client
client := enttest.Open(t, "sqlite3", "file:ent?mode=memory&_fk=1")
defer client.Close()
defer client.Close()

db.Client = client

Expand All @@ -136,9 +141,7 @@ func TestSender(t *testing.T) {
router.GET("/sender/stats", ctrl.Stats)

var paymentOrderUUID uuid.UUID

t.Run("InitiatePaymentOrder", func(t *testing.T) {

// Fetch network from db
network, err := db.Client.Network.
Query().
Expand All @@ -164,69 +167,109 @@ func TestSender(t *testing.T) {
"API-Key": testCtx.apiKey.ID.String(),
}

res, err := test.PerformRequest(t, "POST", "/sender/orders", payload, headers, router)
assert.NoError(t, err)
t.Run("Should fail when network is disabled", func(t *testing.T) {
// Temporarily disable the network
_, err = db.Client.Network.UpdateOne(network).
SetIsEnabled(false).
Save(context.Background())
assert.NoError(t, err)

// Assert the response body
assert.Equal(t, http.StatusCreated, res.Code)
res, err := test.PerformRequest(t, "POST", "/sender/orders", payload, headers, router)
assert.NoError(t, err)

var response types.Response
err = json.Unmarshal(res.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Equal(t, "Payment order initiated successfully", response.Message)
data, ok := response.Data.(map[string]interface{})
assert.True(t, ok, "response.Data is not of type map[string]interface{}")
assert.NotNil(t, data, "response.Data is nil")
// Assert the response body
assert.Equal(t, http.StatusBadRequest, res.Code)

assert.Equal(t, data["amount"], payload["amount"])
assert.Equal(t, data["network"], payload["network"])
assert.Equal(t, data["reference"], payload["reference"])
assert.NotEmpty(t, data["validUntil"])
var response types.Response
err = json.Unmarshal(res.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Equal(t, "Failed to validate payload", response.Message)

// Parse the payment order ID string to uuid.UUID
paymentOrderUUID, err = uuid.Parse(data["id"].(string))
assert.NoError(t, err)
errorData, ok := response.Data.(map[string]interface{})
assert.True(t, ok, "response.Data is not of type map[string]interface{}")
assert.Equal(t, "network", errorData["field"])
assert.Equal(t, "Provided network is not enabled", errorData["message"])

// Query the database for the payment order
paymentOrder, err := db.Client.PaymentOrder.
Query().
Where(paymentorder.IDEQ(paymentOrderUUID)).
WithRecipient().
Only(context.Background())
assert.NoError(t, err)
// Re-enable the network for subsequent tests
_, err = db.Client.Network.UpdateOne(network).
SetIsEnabled(true).
Save(context.Background())
assert.NoError(t, err)
})

assert.NotNil(t, paymentOrder.Edges.Recipient)
assert.Equal(t, paymentOrder.Edges.Recipient.AccountIdentifier, payload["recipient"].(map[string]interface{})["accountIdentifier"])
assert.Equal(t, paymentOrder.Edges.Recipient.Memo, payload["recipient"].(map[string]interface{})["memo"])
assert.Equal(t, paymentOrder.Edges.Recipient.AccountName, payload["recipient"].(map[string]interface{})["accountName"])
assert.Equal(t, paymentOrder.Edges.Recipient.Institution, payload["recipient"].(map[string]interface{})["institution"])
assert.Equal(t, data["senderFee"], "5")
assert.Equal(t, data["transactionFee"], network.Fee.String())
t.Run("Should succeed when network is enabled", func(t *testing.T) {
res, err := test.PerformRequest(t, "POST", "/sender/orders", payload, headers, router)
assert.NoError(t, err)

t.Run("Check Transaction Logs", func(t *testing.T) {
headers := map[string]string{
"API-Key": testCtx.apiKey.ID.String(),
}
// Assert the response body
assert.Equal(t, http.StatusCreated, res.Code)

res, err = test.PerformRequest(t, "GET", fmt.Sprintf("/sender/orders/%s?timestamp=%v", paymentOrderUUID.String(), payload["timestamp"]), nil, headers, router)
var response types.Response
err = json.Unmarshal(res.Body.Bytes(), &response)
assert.NoError(t, err)
assert.Equal(t, "Payment order initiated successfully", response.Message)
data, ok := response.Data.(map[string]interface{})
assert.True(t, ok, "response.Data is not of type map[string]interface{}")
assert.NotNil(t, data, "response.Data is nil")

type Response struct {
Status string `json:"status"`
Message string `json:"message"`
Data types.PaymentOrderResponse `json:"data"`
}
assert.Equal(t, data["amount"], payload["amount"])
assert.Equal(t, data["network"], payload["network"])
assert.Equal(t, data["reference"], payload["reference"])
assert.NotEmpty(t, data["validUntil"])

var response2 Response
// Assert the response body
assert.Equal(t, http.StatusOK, res.Code)
// Parse the payment order ID string to uuid.UUID
paymentOrderUUID, err = uuid.Parse(data["id"].(string))
assert.NoError(t, err)

err = json.Unmarshal(res.Body.Bytes(), &response2)
// Query the database for the payment order
paymentOrder, err := db.Client.PaymentOrder.
Query().
Where(paymentorder.IDEQ(paymentOrderUUID)).
WithRecipient().
Only(context.Background())
assert.NoError(t, err)
assert.Equal(t, "The order has been successfully retrieved", response2.Message)
assert.Equal(t, 1, len(response2.Data.Transactions), "response.Data is nil")

assert.NotNil(t, paymentOrder.Edges.Recipient)
assert.Equal(t, paymentOrder.Edges.Recipient.AccountIdentifier, payload["recipient"].(map[string]interface{})["accountIdentifier"])
assert.Equal(t, paymentOrder.Edges.Recipient.Memo, payload["recipient"].(map[string]interface{})["memo"])
assert.Equal(t, paymentOrder.Edges.Recipient.AccountName, payload["recipient"].(map[string]interface{})["accountName"])
assert.Equal(t, paymentOrder.Edges.Recipient.Institution, payload["recipient"].(map[string]interface{})["institution"])
assert.Equal(t, data["senderFee"], "5")
assert.Equal(t, data["transactionFee"], network.Fee.String())

t.Run("Check Transaction Logs", func(t *testing.T) {
headers := map[string]string{
"API-Key": testCtx.apiKey.ID.String(),
}

res, err = test.PerformRequest(t, "GET", fmt.Sprintf("/sender/orders/%s?timestamp=%v", paymentOrderUUID.String(), payload["timestamp"]), nil, headers, router)
assert.NoError(t, err)

type Response struct {
Status string `json:"status"`
Message string `json:"message"`
Data types.PaymentOrderResponse `json:"data"`
}

var response2 Response
// Assert the response body
assert.Equal(t, http.StatusOK, res.Code)

err = json.Unmarshal(res.Body.Bytes(), &response2)
assert.NoError(t, err)
assert.Equal(t, "The order has been successfully retrieved", response2.Message)
assert.Equal(t, 1, len(response2.Data.Transactions), "response.Data is nil")
})
})

t.Run("New networks should have is_enabled default to false", func(t *testing.T) {
newNetwork, err := db.Client.Network.Create().
SetIdentifier("test-network").
Save(context.Background())
assert.NoError(t, err)

assert.False(t, newNetwork.IsEnabled, "is_enabled should default to false")
})
})

t.Run("GetPaymentOrderByID", func(t *testing.T) {
Expand Down

0 comments on commit 9e929e3

Please sign in to comment.