vspd/database/ticket_test.go
Jamie Holdstock d0dedd3af0
Resolving some TODOs (#71)
* Dont allow duplicate fee addresses

* Load webapi keypair in webapi package.

* Split database test file

* Add extra DB testing.
2020-05-27 14:55:59 +01:00

156 lines
4.2 KiB
Go

package database
import (
"reflect"
"testing"
"time"
)
func exampleTicket() Ticket {
return Ticket{
Hash: "Hash",
CommitmentAddress: "Address",
FeeAddressIndex: 12345,
FeeAddress: "FeeAddress",
FeeAmount: 0.1,
FeeExpiration: 4,
Confirmed: false,
VoteChoices: map[string]string{"AgendaID": "Choice"},
VotingWIF: "VotingKey",
FeeTxHex: "FeeTransction",
FeeTxHash: "",
FeeConfirmed: true,
}
}
func testInsertNewTicket(t *testing.T) {
// Insert a ticket into the database.
ticket := exampleTicket()
err := db.InsertNewTicket(ticket)
if err != nil {
t.Fatalf("error storing ticket in database: %v", err)
}
// Inserting a ticket with different fee address but same hash should fail.
ticket2 := exampleTicket()
ticket2.FeeAddress = ticket.FeeAddress + "2"
err = db.InsertNewTicket(ticket)
if err == nil {
t.Fatal("expected an error inserting ticket with duplicate hash")
}
// Inserting a ticket with different hash but same fee address should fail.
ticket3 := exampleTicket()
ticket3.FeeAddress = ticket.Hash + "2"
err = db.InsertNewTicket(ticket)
if err == nil {
t.Fatal("expected an error inserting ticket with duplicate fee addr")
}
// Inserting a ticket with empty hash should fail.
ticket.Hash = ""
err = db.InsertNewTicket(ticket)
if err == nil {
t.Fatal("expected an error inserting ticket with no hash")
}
}
func testGetTicketByHash(t *testing.T) {
ticket := exampleTicket()
// Insert a ticket into the database.
err := db.InsertNewTicket(ticket)
if err != nil {
t.Fatalf("error storing ticket in database: %v", err)
}
// Retrieve ticket from database.
retrieved, found, err := db.GetTicketByHash(ticket.Hash)
if err != nil {
t.Fatalf("error retrieving ticket by ticket hash: %v", err)
}
if !found {
t.Fatal("expected found==true")
}
// Check ticket fields match expected.
if retrieved.Hash != ticket.Hash ||
retrieved.CommitmentAddress != ticket.CommitmentAddress ||
retrieved.FeeAddressIndex != ticket.FeeAddressIndex ||
retrieved.FeeAddress != ticket.FeeAddress ||
retrieved.FeeAmount != ticket.FeeAmount ||
retrieved.FeeExpiration != ticket.FeeExpiration ||
retrieved.Confirmed != ticket.Confirmed ||
!reflect.DeepEqual(retrieved.VoteChoices, ticket.VoteChoices) ||
retrieved.VotingWIF != ticket.VotingWIF ||
retrieved.FeeTxHex != ticket.FeeTxHex ||
retrieved.FeeTxHash != ticket.FeeTxHash ||
retrieved.FeeConfirmed != ticket.FeeConfirmed {
t.Fatal("retrieved ticket value didnt match expected")
}
// Check found==false when requesting a non-existent ticket.
_, found, err = db.GetTicketByHash("Not a real ticket hash")
if err != nil {
t.Fatalf("error retrieving ticket by ticket hash: %v", err)
}
if found {
t.Fatal("expected found==false")
}
}
func testUpdateTicket(t *testing.T) {
ticket := exampleTicket()
// Insert a ticket into the database.
err := db.InsertNewTicket(ticket)
if err != nil {
t.Fatalf("error storing ticket in database: %v", err)
}
// Update ticket with new values
ticket.FeeAmount = ticket.FeeAmount + 1
ticket.FeeExpiration = ticket.FeeExpiration + 1
err = db.UpdateTicket(ticket)
if err != nil {
t.Fatalf("error updating ticket: %v", err)
}
// Retrieve ticket from database.
retrieved, found, err := db.GetTicketByHash(ticket.Hash)
if err != nil {
t.Fatalf("error retrieving ticket by ticket hash: %v", err)
}
if !found {
t.Fatal("expected found==true")
}
if ticket.FeeAmount != retrieved.FeeAmount ||
ticket.FeeExpiration != retrieved.FeeExpiration {
t.Fatal("retrieved ticket value didnt match expected")
}
// Updating a non-existent ticket should fail.
ticket.Hash = "doesnt exist"
err = db.UpdateTicket(ticket)
if err == nil {
t.Fatal("expected an error updating a ticket with non-existent hash")
}
}
func testTicketFeeExpired(t *testing.T) {
ticket := exampleTicket()
now := time.Now()
hourBefore := now.Add(-time.Hour).Unix()
hourAfter := now.Add(time.Hour).Unix()
ticket.FeeExpiration = hourAfter
if ticket.FeeExpired() {
t.Fatal("expected ticket not to be expired")
}
ticket.FeeExpiration = hourBefore
if !ticket.FeeExpired() {
t.Fatal("expected ticket to be expired")
}
}