mirror of
https://github.com/aclindsa/ofxgo.git
synced 2024-12-26 06:53:21 -05:00
Add additional investment statement response test
This commit is contained in:
parent
cd39e4f8af
commit
9b03829645
355
invstmt_test.go
355
invstmt_test.go
@ -557,3 +557,358 @@ func TestUnmarshalInvStatementResponse(t *testing.T) {
|
||||
|
||||
checkResponsesEqual(t, &expected, response)
|
||||
}
|
||||
|
||||
func TestUnmarshalInvStatementResponse102(t *testing.T) {
|
||||
responseReader := strings.NewReader(`OFXHEADER: 100
|
||||
DATA: OFXSGML
|
||||
VERSION: 102
|
||||
SECURITY: NONE
|
||||
ENCODING: USASCII
|
||||
CHARSET: 1252
|
||||
COMPRESSION: NONE
|
||||
OLDFILEUID: NONE
|
||||
NEWFILEUID: NONE
|
||||
|
||||
<OFX>
|
||||
<SIGNONMSGSRSV1>
|
||||
<SONRS>
|
||||
<STATUS>
|
||||
<CODE>0
|
||||
<SEVERITY>INFO
|
||||
</STATUS>
|
||||
<DTSERVER>20170403120000
|
||||
<LANGUAGE>ENG
|
||||
<FI>
|
||||
<ORG>VV
|
||||
<FID>1000
|
||||
</FI>
|
||||
<INTU.BID>1000
|
||||
</SONRS>
|
||||
</SIGNONMSGSRSV1>
|
||||
<INVSTMTMSGSRSV1>
|
||||
<INVSTMTTRNRS>
|
||||
<TRNUID>1283719872
|
||||
<STATUS>
|
||||
<CODE>0
|
||||
<SEVERITY>INFO
|
||||
</STATUS>
|
||||
<INVSTMTRS>
|
||||
<DTASOF>20170403120000
|
||||
<CURDEF>USD
|
||||
<INVACCTFROM>
|
||||
<BROKERID>www.exampletrader.com
|
||||
<ACCTID>12341234
|
||||
</INVACCTFROM>
|
||||
<INVTRANLIST>
|
||||
<DTSTART>20161206120000
|
||||
<DTEND>20170403120000
|
||||
<SELLOPT>
|
||||
<INVSELL>
|
||||
<INVTRAN>
|
||||
<FITID>12341234-20161207-1
|
||||
<DTTRADE>20161207120000
|
||||
<DTSETTLE>20161208120000
|
||||
</INVTRAN>
|
||||
<SECID>
|
||||
<UNIQUEID>SPY161216C00226000
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<UNITS>-1.0000
|
||||
<UNITPRICE>0.3500
|
||||
<COMMISSION>8.8500
|
||||
<FEES>0.2600
|
||||
<TOTAL>200.8900
|
||||
<SUBACCTSEC>CASH
|
||||
<SUBACCTFUND>CASH
|
||||
</INVSELL>
|
||||
<OPTSELLTYPE>SELLTOOPEN
|
||||
<SHPERCTRCT>100
|
||||
</SELLOPT>
|
||||
<CLOSUREOPT>
|
||||
<INVTRAN>
|
||||
<FITID>12341234-20161215-1
|
||||
<DTTRADE>20161215120000
|
||||
<DTSETTLE>20161220120000
|
||||
</INVTRAN>
|
||||
<SECID>
|
||||
<UNIQUEID>78462F10
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<OPTACTION>ASSIGN
|
||||
<UNITS>-100.0000
|
||||
<SHPERCTRCT>100
|
||||
<SUBACCTSEC>CASH
|
||||
</CLOSUREOPT>
|
||||
<CLOSUREOPT>
|
||||
<INVTRAN>
|
||||
<FITID>12341234-20161215-2
|
||||
<DTTRADE>20161215120000
|
||||
<DTSETTLE>20161215120000
|
||||
</INVTRAN>
|
||||
<SECID>
|
||||
<UNIQUEID>SPY161216C00226000
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<OPTACTION>ASSIGN
|
||||
<UNITS>1.0000
|
||||
<SHPERCTRCT>100
|
||||
<SUBACCTSEC>CASH
|
||||
</CLOSUREOPT>
|
||||
</INVTRANLIST>
|
||||
<INVPOSLIST>
|
||||
<POSSTOCK>
|
||||
<INVPOS>
|
||||
<SECID>
|
||||
<UNIQUEID>04956010
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<HELDINACCT>CASH
|
||||
<POSTYPE>LONG
|
||||
<UNITS>100
|
||||
<UNITPRICE>79.0000
|
||||
<MKTVAL>79000
|
||||
<DTPRICEASOF>20170403120000
|
||||
</INVPOS>
|
||||
</POSSTOCK>
|
||||
<POSSTOCK>
|
||||
<INVPOS>
|
||||
<SECID>
|
||||
<UNIQUEID>36960410
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<HELDINACCT>CASH
|
||||
<POSTYPE>LONG
|
||||
<UNITS>100.00
|
||||
<UNITPRICE>29.8700
|
||||
<MKTVAL>2987.00
|
||||
<DTPRICEASOF>20170403120000
|
||||
</INVPOS>
|
||||
</POSSTOCK>
|
||||
</INVPOSLIST>
|
||||
<INVBAL>
|
||||
<AVAILCASH>0.0
|
||||
<MARGINBALANCE>-0.00
|
||||
<SHORTBALANCE>0.00
|
||||
</INVBAL>
|
||||
</INVSTMTRS>
|
||||
</INVSTMTTRNRS>
|
||||
</INVSTMTMSGSRSV1>
|
||||
<SECLISTMSGSRSV1>
|
||||
<SECLIST>
|
||||
<STOCKINFO>
|
||||
<SECINFO>
|
||||
<SECID>
|
||||
<UNIQUEID>78462F10
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<SECNAME>SPDR S&P 500 ETF TRUST
|
||||
<TICKER>SPY
|
||||
</SECINFO>
|
||||
</STOCKINFO>
|
||||
<OPTINFO>
|
||||
<SECINFO>
|
||||
<SECID>
|
||||
<UNIQUEID>SPY161216C00226000
|
||||
<UNIQUEIDTYPE>CUSIP
|
||||
</SECID>
|
||||
<SECNAME>SPY Dec 16 2016 226.00 Call
|
||||
<TICKER>SPY 161216C00226000
|
||||
</SECINFO>
|
||||
<OPTTYPE>CALL
|
||||
<STRIKEPRICE>226.00
|
||||
<DTEXPIRE>20161216120000
|
||||
<SHPERCTRCT>100
|
||||
</OPTINFO>
|
||||
</SECLIST>
|
||||
</SECLISTMSGSRSV1>
|
||||
</OFX>`)
|
||||
var expected ofxgo.Response
|
||||
GMT := time.FixedZone("GMT", 0)
|
||||
|
||||
expected.Version = "102"
|
||||
expected.Signon.Status.Code = 0
|
||||
expected.Signon.Status.Severity = "INFO"
|
||||
expected.Signon.DtServer = ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT))
|
||||
expected.Signon.Language = "ENG"
|
||||
expected.Signon.Org = "VV"
|
||||
expected.Signon.Fid = "1000"
|
||||
// Ignored <INTU.BID>1000
|
||||
|
||||
var units1, unitprice1, commission1, fees1, total1, units2, units3 big.Rat
|
||||
units1.SetFrac64(-1, 1)
|
||||
unitprice1.SetFrac64(35, 100)
|
||||
commission1.SetFrac64(885, 100)
|
||||
fees1.SetFrac64(26, 100)
|
||||
total1.SetFrac64(20089, 100)
|
||||
units2.SetFrac64(-100, 1)
|
||||
units3.SetFrac64(1, 1)
|
||||
|
||||
dtsettle1 := ofxgo.Date(time.Date(2016, 12, 8, 12, 0, 0, 0, GMT))
|
||||
dtsettle2 := ofxgo.Date(time.Date(2016, 12, 20, 12, 0, 0, 0, GMT))
|
||||
dtsettle3 := ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT))
|
||||
|
||||
invtranlist := ofxgo.InvTranList{
|
||||
DtStart: ofxgo.Date(time.Date(2016, 12, 6, 12, 0, 0, 0, GMT)),
|
||||
DtEnd: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
|
||||
InvTransactions: []ofxgo.InvTransaction{
|
||||
ofxgo.SellOpt{
|
||||
InvSell: ofxgo.InvSell{
|
||||
InvTran: ofxgo.InvTran{
|
||||
FiTId: "12341234-20161207-1",
|
||||
DtTrade: ofxgo.Date(time.Date(2016, 12, 7, 12, 0, 0, 0, GMT)),
|
||||
DtSettle: &dtsettle1,
|
||||
},
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "SPY161216C00226000",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
Units: ofxgo.Amount(units1),
|
||||
UnitPrice: ofxgo.Amount(unitprice1),
|
||||
Commission: ofxgo.Amount(commission1),
|
||||
Fees: ofxgo.Amount(fees1),
|
||||
Total: ofxgo.Amount(total1),
|
||||
SubAcctSec: "CASH",
|
||||
SubAcctFund: "CASH",
|
||||
},
|
||||
OptSellType: "SELLTOOPEN",
|
||||
ShPerCtrct: 100,
|
||||
},
|
||||
ofxgo.ClosureOpt{
|
||||
InvTran: ofxgo.InvTran{
|
||||
FiTId: "12341234-20161215-1",
|
||||
DtTrade: ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT)),
|
||||
DtSettle: &dtsettle2,
|
||||
},
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "78462F10",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
OptAction: "ASSIGN",
|
||||
Units: ofxgo.Amount(units2),
|
||||
ShPerCtrct: 100,
|
||||
SubAcctSec: "CASH",
|
||||
},
|
||||
ofxgo.ClosureOpt{
|
||||
InvTran: ofxgo.InvTran{
|
||||
FiTId: "12341234-20161215-2",
|
||||
DtTrade: ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT)),
|
||||
DtSettle: &dtsettle3,
|
||||
},
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "SPY161216C00226000",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
OptAction: "ASSIGN",
|
||||
Units: ofxgo.Amount(units3),
|
||||
ShPerCtrct: 100,
|
||||
SubAcctSec: "CASH",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var availcash, marginbalance, shortbalance big.Rat
|
||||
availcash.SetFrac64(0, 1)
|
||||
marginbalance.SetFrac64(-0, 1)
|
||||
shortbalance.SetFrac64(0, 1)
|
||||
|
||||
invbalance := ofxgo.InvBalance{
|
||||
AvailCash: ofxgo.Amount(availcash),
|
||||
MarginBalance: ofxgo.Amount(marginbalance),
|
||||
ShortBalance: ofxgo.Amount(shortbalance),
|
||||
}
|
||||
|
||||
var posunits1, posunitprice1, posmktval1, posunits2, posunitprice2, posmktval2 big.Rat
|
||||
posunits1.SetFrac64(100, 1)
|
||||
posunitprice1.SetFrac64(79, 1)
|
||||
posmktval1.SetFrac64(79000, 1)
|
||||
posunits2.SetFrac64(100, 1)
|
||||
posunitprice2.SetFrac64(2987, 100)
|
||||
posmktval2.SetFrac64(2987, 1)
|
||||
|
||||
statementResponse := ofxgo.InvStatementResponse{
|
||||
TrnUID: "1283719872",
|
||||
Status: ofxgo.Status{
|
||||
Code: 0,
|
||||
Severity: "INFO",
|
||||
},
|
||||
DtAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
|
||||
CurDef: "USD",
|
||||
InvAcctFrom: ofxgo.InvAcct{
|
||||
BrokerId: "www.exampletrader.com",
|
||||
AcctId: "12341234",
|
||||
},
|
||||
InvTranList: &invtranlist,
|
||||
InvPosList: ofxgo.PositionList{
|
||||
ofxgo.StockPosition{
|
||||
InvPos: ofxgo.InvPosition{
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "04956010",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
HeldInAcct: "CASH",
|
||||
PosType: "LONG",
|
||||
Units: ofxgo.Amount(posunits1),
|
||||
UnitPrice: ofxgo.Amount(posunitprice1),
|
||||
MktVal: ofxgo.Amount(posmktval1),
|
||||
DtPriceAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
|
||||
},
|
||||
},
|
||||
ofxgo.StockPosition{
|
||||
InvPos: ofxgo.InvPosition{
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "36960410",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
HeldInAcct: "CASH",
|
||||
PosType: "LONG",
|
||||
Units: ofxgo.Amount(posunits2),
|
||||
UnitPrice: ofxgo.Amount(posunitprice2),
|
||||
MktVal: ofxgo.Amount(posmktval2),
|
||||
DtPriceAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
|
||||
},
|
||||
},
|
||||
},
|
||||
InvBal: &invbalance,
|
||||
}
|
||||
expected.InvStmt = append(expected.InvStmt, &statementResponse)
|
||||
|
||||
var strikeprice big.Rat
|
||||
strikeprice.SetFrac64(226, 1)
|
||||
|
||||
seclist := ofxgo.SecurityList{
|
||||
Securities: []ofxgo.Security{
|
||||
ofxgo.StockInfo{
|
||||
SecInfo: ofxgo.SecInfo{
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "78462F10",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
SecName: "SPDR S&P 500 ETF TRUST",
|
||||
Ticker: "SPY",
|
||||
},
|
||||
},
|
||||
ofxgo.OptInfo{
|
||||
SecInfo: ofxgo.SecInfo{
|
||||
SecId: ofxgo.SecurityId{
|
||||
UniqueId: "SPY161216C00226000",
|
||||
UniqueIdType: "CUSIP",
|
||||
},
|
||||
SecName: "SPY Dec 16 2016 226.00 Call",
|
||||
Ticker: "SPY 161216C00226000",
|
||||
},
|
||||
OptType: "CALL",
|
||||
StrikePrice: ofxgo.Amount(strikeprice),
|
||||
DtExpire: ofxgo.Date(time.Date(2016, 12, 16, 12, 0, 0, 0, GMT)),
|
||||
ShPerCtrct: 100,
|
||||
},
|
||||
},
|
||||
}
|
||||
expected.SecList = append(expected.SecList, &seclist)
|
||||
|
||||
response, err := ofxgo.ParseResponse(responseReader)
|
||||
if err != nil {
|
||||
t.Fatalf("Unexpected error unmarshalling response: %s\n", err)
|
||||
}
|
||||
|
||||
checkResponsesEqual(t, &expected, response)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user