mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-16 18:25:11 -06:00
tests xaccTransGetTxnType heuristics
tests TXN_TYPE_NONE in utest-Transaction.c testing TXN_TYPE_INVOICE, TXN_TYPE_PAYMENT, and TXN_TYPE_LINK will require valid posted invoices, so, are best tested in utest-Invoice.c
This commit is contained in:
parent
fd12d3900c
commit
ec3e996f92
@ -25,6 +25,7 @@
|
|||||||
#include <qof.h>
|
#include <qof.h>
|
||||||
#include <unittest-support.h>
|
#include <unittest-support.h>
|
||||||
#include "../gncInvoice.h"
|
#include "../gncInvoice.h"
|
||||||
|
#include "../Transaction.h"
|
||||||
|
|
||||||
static const gchar *suitename = "/engine/gncInvoice";
|
static const gchar *suitename = "/engine/gncInvoice";
|
||||||
void test_suite_gncInvoice ( void );
|
void test_suite_gncInvoice ( void );
|
||||||
@ -48,7 +49,9 @@ typedef struct
|
|||||||
gnc_commodity *commodity;
|
gnc_commodity *commodity;
|
||||||
|
|
||||||
GncInvoice* invoice;
|
GncInvoice* invoice;
|
||||||
|
GncInvoice* invoice2;
|
||||||
Transaction *trans;
|
Transaction *trans;
|
||||||
|
Transaction *trans2;
|
||||||
} Fixture;
|
} Fixture;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -66,16 +69,20 @@ setup( Fixture *fixture, gconstpointer pData )
|
|||||||
|
|
||||||
if (data->is_cust_doc)
|
if (data->is_cust_doc)
|
||||||
{
|
{
|
||||||
|
xaccAccountSetType (fixture->account2, ACCT_TYPE_RECEIVABLE);
|
||||||
fixture->customer = gncCustomerCreate(fixture->book);
|
fixture->customer = gncCustomerCreate(fixture->book);
|
||||||
gncOwnerInitCustomer(&fixture->owner, fixture->customer);
|
gncOwnerInitCustomer(&fixture->owner, fixture->customer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
xaccAccountSetType (fixture->account2, ACCT_TYPE_PAYABLE);
|
||||||
fixture->vendor = gncVendorCreate(fixture->book);
|
fixture->vendor = gncVendorCreate(fixture->book);
|
||||||
gncOwnerInitVendor(&fixture->owner, fixture->vendor);
|
gncOwnerInitVendor(&fixture->owner, fixture->vendor);
|
||||||
}
|
}
|
||||||
|
|
||||||
fixture->invoice = gncInvoiceCreate(fixture->book);
|
fixture->invoice = gncInvoiceCreate(fixture->book);
|
||||||
|
fixture->invoice2 = NULL;
|
||||||
|
fixture->trans2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -143,12 +150,137 @@ setup_with_invoice( Fixture *fixture, gconstpointer pData )
|
|||||||
fixture->trans = gncInvoicePostToAccount(fixture->invoice, fixture->account2, ts1, ts2, "memo", TRUE, FALSE);
|
fixture->trans = gncInvoicePostToAccount(fixture->invoice, fixture->account2, ts1, ts2, "memo", TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_with_invoice_and_payment (Fixture *fixture, gconstpointer pData)
|
||||||
|
{
|
||||||
|
Split *split;
|
||||||
|
GNCLot *lot;
|
||||||
|
gnc_numeric amt = gnc_numeric_create (1000, 100);
|
||||||
|
|
||||||
|
/* 1. create invoice */
|
||||||
|
setup_with_invoice (fixture, pData);
|
||||||
|
|
||||||
|
/* 2. create payment */
|
||||||
|
fixture->trans2 = xaccMallocTransaction (fixture->book);
|
||||||
|
lot = gncInvoiceGetPostedLot (fixture->invoice);
|
||||||
|
|
||||||
|
xaccTransBeginEdit (fixture->trans2);
|
||||||
|
xaccTransSetCurrency (fixture->trans2, fixture->commodity);
|
||||||
|
|
||||||
|
/* This split will balance the invoice lot */
|
||||||
|
split = xaccMallocSplit (fixture->book);
|
||||||
|
xaccSplitSetParent (split, fixture->trans2);
|
||||||
|
xaccAccountBeginEdit (fixture->account2);
|
||||||
|
xaccSplitSetAccount (split, fixture->account2);
|
||||||
|
xaccSplitSetValue (split, gnc_numeric_neg (amt));
|
||||||
|
xaccSplitSetAmount (split, gnc_numeric_neg (amt));
|
||||||
|
xaccSplitSetLot (split, lot);
|
||||||
|
|
||||||
|
/* bank split will balance the transaction */
|
||||||
|
split = xaccMallocSplit (fixture->book);
|
||||||
|
xaccSplitSetParent (split, fixture->trans2);
|
||||||
|
xaccAccountBeginEdit (fixture->account);
|
||||||
|
xaccSplitSetAccount (split, fixture->account);
|
||||||
|
xaccSplitSetValue (split, amt);
|
||||||
|
xaccSplitSetAmount (split, amt);
|
||||||
|
|
||||||
|
xaccTransCommitEdit (fixture->trans2);
|
||||||
|
xaccAccountCommitEdit (fixture->account);
|
||||||
|
xaccAccountCommitEdit (fixture->account2);
|
||||||
|
|
||||||
|
gncInvoiceAutoApplyPayments (fixture->invoice);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_with_invoice_and_CN (Fixture *fixture, gconstpointer pData)
|
||||||
|
{
|
||||||
|
const InvoiceData *data = (InvoiceData*) pData;
|
||||||
|
|
||||||
|
time64 ts1 = gnc_time(NULL);
|
||||||
|
time64 ts2 = ts1;
|
||||||
|
const char *desc = "Test description";
|
||||||
|
GncEntry *entry = NULL;
|
||||||
|
Split *split;
|
||||||
|
GNCLot *lot1, *lot2;
|
||||||
|
gnc_numeric amt = gnc_numeric_create (1000, 100);
|
||||||
|
|
||||||
|
setup (fixture, pData);
|
||||||
|
|
||||||
|
/* 1. invoice */
|
||||||
|
fixture->invoice = gncInvoiceCreate (fixture->book);
|
||||||
|
gncInvoiceSetCurrency (fixture->invoice, fixture->commodity);
|
||||||
|
gncInvoiceSetOwner (fixture->invoice, &fixture->owner);
|
||||||
|
|
||||||
|
entry = gncEntryCreate(fixture->book);
|
||||||
|
gncEntrySetDate (entry, ts1);
|
||||||
|
gncEntrySetDateEntered (entry, ts1);
|
||||||
|
gncEntrySetDescription (entry, desc);
|
||||||
|
gncEntrySetDocQuantity (entry, amt, FALSE);
|
||||||
|
gncEntrySetBillAccount (entry, fixture->account);
|
||||||
|
gncBillAddEntry (fixture->invoice, entry);
|
||||||
|
|
||||||
|
gncInvoicePostToAccount (fixture->invoice, fixture->account2, ts1, ts2, "memo", TRUE, FALSE);
|
||||||
|
|
||||||
|
/* 2. CN */
|
||||||
|
fixture->invoice2 = gncInvoiceCreate (fixture->book);
|
||||||
|
gncInvoiceSetCurrency (fixture->invoice2, fixture->commodity);
|
||||||
|
gncInvoiceSetOwner (fixture->invoice2, &fixture->owner);
|
||||||
|
|
||||||
|
entry = gncEntryCreate(fixture->book);
|
||||||
|
gncEntrySetDate (entry, ts1);
|
||||||
|
gncEntrySetDateEntered (entry, ts1);
|
||||||
|
gncEntrySetDescription (entry, desc);
|
||||||
|
gncEntrySetDocQuantity (entry, amt, TRUE);
|
||||||
|
gncEntrySetInvAccount(entry, fixture->account);
|
||||||
|
gncInvoiceAddEntry (fixture->invoice2, entry);
|
||||||
|
|
||||||
|
gncInvoicePostToAccount (fixture->invoice2, fixture->account2, ts1, ts2, "memo", TRUE, FALSE);
|
||||||
|
|
||||||
|
/* 3. now create the LL txn linking Invoice and CN */
|
||||||
|
lot1 = gncInvoiceGetPostedLot (fixture->invoice);
|
||||||
|
lot2 = gncInvoiceGetPostedLot (fixture->invoice2);
|
||||||
|
fixture->trans2 = xaccMallocTransaction (fixture->book);
|
||||||
|
|
||||||
|
xaccTransBeginEdit (fixture->trans2);
|
||||||
|
xaccTransSetCurrency (fixture->trans2, fixture->commodity);
|
||||||
|
xaccAccountBeginEdit (fixture->account2);
|
||||||
|
|
||||||
|
/* This split will balance the invoice */
|
||||||
|
split = xaccMallocSplit (fixture->book);
|
||||||
|
xaccSplitSetParent (split, fixture->trans2);
|
||||||
|
xaccSplitSetAccount (split, fixture->account2);
|
||||||
|
xaccSplitSetValue (split, gnc_numeric_neg (amt));
|
||||||
|
xaccSplitSetAmount (split, gnc_numeric_neg (amt));
|
||||||
|
xaccSplitSetLot (split, lot1);
|
||||||
|
|
||||||
|
/* This split will balance the CN*/
|
||||||
|
split = xaccMallocSplit (fixture->book);
|
||||||
|
xaccSplitSetParent (split, fixture->trans2);
|
||||||
|
xaccSplitSetAccount (split, fixture->account2);
|
||||||
|
xaccSplitSetValue (split, amt);
|
||||||
|
xaccSplitSetAmount (split, amt);
|
||||||
|
xaccSplitSetLot (split, lot2);
|
||||||
|
|
||||||
|
xaccTransCommitEdit (fixture->trans2);
|
||||||
|
xaccAccountCommitEdit (fixture->account2);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
teardown_with_invoice( Fixture *fixture, gconstpointer pData )
|
teardown_with_invoice( Fixture *fixture, gconstpointer pData )
|
||||||
{
|
{
|
||||||
|
if (fixture->trans2)
|
||||||
|
xaccTransDestroy (fixture->trans2);
|
||||||
|
|
||||||
gncInvoiceUnpost(fixture->invoice, TRUE);
|
gncInvoiceUnpost(fixture->invoice, TRUE);
|
||||||
gncInvoiceRemoveEntries (fixture->invoice);
|
gncInvoiceRemoveEntries (fixture->invoice);
|
||||||
|
|
||||||
|
if (fixture->invoice2)
|
||||||
|
{
|
||||||
|
gncInvoiceUnpost(fixture->invoice2, TRUE);
|
||||||
|
gncInvoiceRemoveEntries (fixture->invoice2);
|
||||||
|
}
|
||||||
|
|
||||||
teardown(fixture, pData);
|
teardown(fixture, pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,6 +362,25 @@ test_invoice_posted_trans ( Fixture *fixture, gconstpointer pData )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Testing for TXN_TYPE_INVOICE TXN_TYPE_PAYMENT are strictly testing functions
|
||||||
|
// in Transaction.c, but require creating invoices, so, they are tested in
|
||||||
|
// this file instead.
|
||||||
|
static void
|
||||||
|
test_xaccTransGetTxnTypeInvoice (Fixture *fixture, gconstpointer pData)
|
||||||
|
{
|
||||||
|
g_assert_cmpint (TXN_TYPE_INVOICE, ==, xaccTransGetTxnType (fixture->trans));
|
||||||
|
|
||||||
|
g_assert_cmpint (TXN_TYPE_PAYMENT, ==, xaccTransGetTxnType (fixture->trans2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_xaccTransGetTxnTypeLink (Fixture *fixture, gconstpointer pData)
|
||||||
|
{
|
||||||
|
g_assert_cmpint (TXN_TYPE_LINK, ==, xaccTransGetTxnType (fixture->trans2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_suite_gncInvoice ( void )
|
test_suite_gncInvoice ( void )
|
||||||
{
|
{
|
||||||
@ -244,4 +395,8 @@ test_suite_gncInvoice ( void )
|
|||||||
GNC_TEST_ADD( suitename, "post trans - customer creditnote", Fixture, &pData, setup_with_invoice, test_invoice_posted_trans, teardown_with_invoice );
|
GNC_TEST_ADD( suitename, "post trans - customer creditnote", Fixture, &pData, setup_with_invoice, test_invoice_posted_trans, teardown_with_invoice );
|
||||||
pData.is_cn = FALSE; // Customer invoice
|
pData.is_cn = FALSE; // Customer invoice
|
||||||
GNC_TEST_ADD( suitename, "post trans - customer invoice", Fixture, &pData, setup_with_invoice, test_invoice_posted_trans, teardown_with_invoice );
|
GNC_TEST_ADD( suitename, "post trans - customer invoice", Fixture, &pData, setup_with_invoice, test_invoice_posted_trans, teardown_with_invoice );
|
||||||
|
|
||||||
|
/* test txn type heuristics */
|
||||||
|
GNC_TEST_ADD( suitename, "tests txntype I & P", Fixture, &pData, setup_with_invoice_and_payment, test_xaccTransGetTxnTypeInvoice, teardown_with_invoice);
|
||||||
|
GNC_TEST_ADD( suitename, "tests txntype L", Fixture, &pData, setup_with_invoice_and_CN, test_xaccTransGetTxnTypeLink, teardown_with_invoice);
|
||||||
}
|
}
|
||||||
|
@ -1838,6 +1838,10 @@ test_xaccTransGetReadOnly (Fixture *fixture, gconstpointer pData)
|
|||||||
static void
|
static void
|
||||||
test_xaccTransGetTxnType (Fixture *fixture, gconstpointer pData)
|
test_xaccTransGetTxnType (Fixture *fixture, gconstpointer pData)
|
||||||
{
|
{
|
||||||
|
// note this will only test TXN_TYPE_NONE, because TxnType is derived
|
||||||
|
// from split data. Testing for TXN_TYPE_INVOICE TXN_TYPE_PAYMENT
|
||||||
|
// will require creating invoices, so, they are tested in
|
||||||
|
// utest-Invoice.c
|
||||||
auto txn = fixture->txn;
|
auto txn = fixture->txn;
|
||||||
g_assert_cmpint (TXN_TYPE_NONE, ==, xaccTransGetTxnType(txn));
|
g_assert_cmpint (TXN_TYPE_NONE, ==, xaccTransGetTxnType(txn));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user