mirror of
				https://github.com/aclindsa/moneygo.git
				synced 2025-11-04 02:23:26 -05:00 
			
		
		
		
	Add initial gnucash importing test
This is woefully incomplete, but tests to make sure at least one balance on one account is correct...
This commit is contained in:
		
							
								
								
									
										103
									
								
								internal/handlers/gnucash_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								internal/handlers/gnucash_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
			
		||||
package handlers_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"github.com/aclindsa/moneygo/internal/handlers"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"mime/multipart"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func importGnucash(client *http.Client, filename string) error {
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	mw := multipart.NewWriter(&buf)
 | 
			
		||||
 | 
			
		||||
	file, err := os.Open(filename)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	filewriter, err := mw.CreateFormFile("gnucash", filename)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if _, err := io.Copy(filewriter, file); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mw.Close()
 | 
			
		||||
 | 
			
		||||
	response, err := client.Post(server.URL+"/v1/imports/gnucash", mw.FormDataContentType(), &buf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	body, err := ioutil.ReadAll(response.Body)
 | 
			
		||||
	response.Body.Close()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var e handlers.Error
 | 
			
		||||
	err = (&e).Read(string(body))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if e.ErrorId != 0 || len(e.ErrorString) != 0 {
 | 
			
		||||
		return &e
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestImportGnucash(t *testing.T) {
 | 
			
		||||
	RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
			
		||||
		// Ensure there's only one USD currency
 | 
			
		||||
		oldDefault, err := getSecurity(d.clients[0], d.users[0].DefaultCurrency)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("Error fetching default security: %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
		d.users[0].DefaultCurrency = d.securities[0].SecurityId
 | 
			
		||||
		if _, err := updateUser(d.clients[0], &d.users[0]); err != nil {
 | 
			
		||||
			t.Fatalf("Error updating user: %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
		if err := deleteSecurity(d.clients[0], oldDefault); err != nil {
 | 
			
		||||
			t.Fatalf("Error removing default security: %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Import and ensure it didn't return a nasty error code
 | 
			
		||||
		if err = importGnucash(d.clients[0], "handlers_testdata/example.gnucash"); err != nil {
 | 
			
		||||
			t.Fatalf("Error importing from Gnucash: %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Next, find the Expenses/Groceries account
 | 
			
		||||
		var groceries *handlers.Account
 | 
			
		||||
		accounts, err := getAccounts(d.clients[0])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("Error fetching accounts: %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
		for _, account := range *accounts.Accounts {
 | 
			
		||||
			if account.Name == "Groceries" {
 | 
			
		||||
				groceries = &account
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if groceries == nil {
 | 
			
		||||
			t.Fatalf("Couldn't find 'Expenses/Groceries' account")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		grocerytransactions, err := getAccountTransactions(d.clients[0], groceries.AccountId, 0, 0, "")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("Couldn't fetch account transactions for 'Expenses/Groceries': %s\n", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 87.19 from preexisting transactions and 200.37 from Gnucash
 | 
			
		||||
		if grocerytransactions.EndingBalance != "287.56" {
 | 
			
		||||
			t.Errorf("Expected ending balance for 'Expenses/Groceries' to be '287.56', but found %s\n", grocerytransactions.EndingBalance)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								internal/handlers/handlers_testdata/example.gnucash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								internal/handlers/handlers_testdata/example.gnucash
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user