2022-09-01 14:40:50 -05:00
/********************************************************************\
* test - gnc - price - quotes . cpp - - Unit tests for GncQuotes *
* *
* Copyright 2022 John Ralls < jralls @ ceridwen . us > *
* *
* This program is free software ; you can redistribute it and / or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation ; either version 2 of *
* the License , or ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program ; if not , contact : *
* *
* Free Software Foundation Voice : + 1 - 617 - 542 - 5942 *
* 51 Franklin Street , Fifth Floor Fax : + 1 - 617 - 542 - 2652 *
* Boston , MA 02110 - 1301 , USA gnu @ gnu . org *
* *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <config.h>
# include <gnc-session.h>
# include <gnc-commodity.h>
# include <gnc-pricedb-p.h>
# include <qof.h>
/* gnc-quotes normally gets this from gnc-ui-util, but let's avoid the dependency. */
2023-01-23 07:57:38 -06:00
extern " C " {
2022-09-01 14:40:50 -05:00
static gnc_commodity *
gnc_default_currency ( void )
{
auto book { qof_session_get_book ( gnc_get_current_session ( ) ) } ;
auto table { gnc_commodity_table_get_table ( book ) } ;
return gnc_commodity_table_lookup ( table , GNC_COMMODITY_NS_CURRENCY , " USD " ) ;
}
2023-01-23 07:57:38 -06:00
}
2022-09-01 14:40:50 -05:00
# include <gtest/gtest.h>
# include "../gnc-quotes.cpp"
2022-09-01 19:11:40 -05:00
class GncMockQuoteSource final : public GncQuoteSource
{
const std : : string m_version { " 9.99 " } ;
const StrVec m_sources { " currency " , " yahoo_json " } ;
2022-09-10 15:30:15 -05:00
const StrVec m_quotes ;
const StrVec m_errors ;
2022-09-01 19:11:40 -05:00
public :
2022-09-10 15:30:15 -05:00
GncMockQuoteSource ( StrVec & & quotes , StrVec & & errors ) :
m_quotes { std : : move ( quotes ) } , m_errors { std : : move ( errors ) } { }
~ GncMockQuoteSource ( ) override = default ;
2022-10-13 19:59:14 -05:00
const std : : string & get_version ( ) const noexcept override { return m_version ; }
const StrVec & get_sources ( ) const noexcept override { return m_sources ; }
QuoteResult get_quotes ( const std : : string & ) const override ;
} ;
class GncFailedQuoteSource final : public GncQuoteSource
{
const std : : string m_version { " 0 " } ;
const StrVec m_sources ;
public :
GncFailedQuoteSource ( )
{
std : : string err { " Failed to initialize Finance::Quote: " } ;
err + = " missing_modules Mozilla::CA Try::Tiny " ;
throw GncQuoteSourceError ( err ) ;
}
~ GncFailedQuoteSource ( ) override = default ;
const std : : string & get_version ( ) const noexcept override { return m_version ; }
const StrVec & get_sources ( ) const noexcept override { return m_sources ; }
QuoteResult get_quotes ( const std : : string & ) const override { return { 0 , { } , { } } ; }
2022-09-01 19:11:40 -05:00
} ;
QuoteResult
GncMockQuoteSource : : get_quotes ( const std : : string & json_string ) const
{
2022-10-13 19:59:14 -05:00
if ( m_errors . empty ( ) )
return { 0 , m_quotes , m_errors } ;
return { 1 , m_quotes , m_errors } ;
2022-09-01 19:11:40 -05:00
}
2022-09-12 20:39:18 -05:00
2022-09-01 14:40:50 -05:00
class GncQuotesTest : public : : testing : : Test
{
protected :
GncQuotesTest ( ) : m_session { gnc_get_current_session ( ) } ,
m_book { qof_session_get_book ( gnc_get_current_session ( ) ) }
{
qof_init ( ) ;
gnc_commodity_table_register ( ) ;
gnc_pricedb_register ( ) ;
auto comm_table { gnc_commodity_table_new ( ) } ;
qof_book_set_data ( m_book , GNC_COMMODITY_TABLE , comm_table ) ;
auto eur = gnc_commodity_new ( m_book , " Euro " , " ISO4217 " , " EUR " , NULL , 100 ) ;
auto source { gnc_quote_source_lookup_by_internal ( " currency " ) } ;
gnc_commodity_begin_edit ( eur ) ;
gnc_commodity_set_quote_flag ( eur , TRUE ) ;
gnc_commodity_set_quote_source ( eur , source ) ;
gnc_commodity_commit_edit ( eur ) ;
gnc_commodity_table_insert ( comm_table , eur ) ;
auto usd = gnc_commodity_new ( m_book , " United States Dollar " , " CURRENCY " ,
" USD " , NULL , 100 ) ;
gnc_commodity_table_insert ( comm_table , usd ) ;
source = gnc_quote_source_lookup_by_internal ( " yahoo_json " ) ;
auto aapl = gnc_commodity_new ( m_book , " Apple " , " NASDAQ " , " AAPL " , NULL , 1 ) ;
gnc_commodity_begin_edit ( aapl ) ;
gnc_commodity_set_quote_flag ( aapl , TRUE ) ;
gnc_commodity_set_quote_source ( aapl , source ) ;
gnc_commodity_commit_edit ( aapl ) ;
gnc_commodity_table_insert ( comm_table , aapl ) ;
auto hpe = gnc_commodity_new ( m_book , " Hewlett Packard " , " NYSE " , " HPE " ,
NULL , 1 ) ;
gnc_commodity_begin_edit ( hpe ) ;
gnc_commodity_set_quote_flag ( hpe , TRUE ) ;
gnc_commodity_set_quote_source ( hpe , source ) ;
gnc_commodity_commit_edit ( hpe ) ;
gnc_commodity_table_insert ( comm_table , hpe ) ;
auto fkcm = gnc_commodity_new ( m_book , " Fake Company " , " NASDAQ " , " FKCM " , NULL , 1 ) ;
gnc_commodity_begin_edit ( fkcm ) ;
gnc_commodity_set_quote_flag ( fkcm , TRUE ) ;
gnc_commodity_set_quote_source ( fkcm , source ) ;
gnc_commodity_commit_edit ( fkcm ) ;
gnc_commodity_table_insert ( comm_table , fkcm ) ;
gnc_quote_source_set_fq_installed ( " TestSuite " , g_list_prepend ( nullptr , ( void * ) " yahoo_json " ) ) ;
}
~ GncQuotesTest ( ) {
gnc_clear_current_session ( ) ;
}
QofSession * m_session ;
QofBook * m_book ;
} ;
TEST_F ( GncQuotesTest , quote_sources )
{
auto qs_cur { gnc_quote_source_lookup_by_internal ( " currency " ) } ;
auto qs_yahoo { gnc_quote_source_lookup_by_internal ( " yahoo_json " ) } ;
auto qs_alpha { gnc_quote_source_lookup_by_internal ( " alphavantage " ) } ;
EXPECT_TRUE ( qs_cur ! = nullptr ) ;
EXPECT_TRUE ( qs_yahoo ! = nullptr ) ;
EXPECT_TRUE ( qs_alpha ! = nullptr ) ;
EXPECT_TRUE ( gnc_quote_source_get_supported ( qs_cur ) ) ;
EXPECT_TRUE ( gnc_quote_source_get_supported ( qs_yahoo ) ) ;
EXPECT_FALSE ( gnc_quote_source_get_supported ( qs_alpha ) ) ;
}
TEST_F ( GncQuotesTest , quotable_commodities )
{
auto commodities { gnc_quotes_get_quotable_commodities ( gnc_commodity_table_get_table ( m_book ) ) } ;
EXPECT_EQ ( 4u , commodities . size ( ) ) ;
}
2022-09-01 17:46:47 -05:00
# ifdef HAVE_F_Q
2022-09-01 19:11:40 -05:00
TEST_F ( GncQuotesTest , online_wiggle )
2022-09-01 14:40:50 -05:00
{
GncQuotes quotes ;
quotes . fetch ( m_book ) ;
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
2022-09-17 13:52:15 -05:00
auto failures { quotes . failures ( ) } ;
2022-09-27 17:05:04 -05:00
ASSERT_EQ ( 1u , failures . size ( ) ) ;
2022-09-17 13:52:15 -05:00
EXPECT_EQ ( GncQuoteError : : QUOTE_FAILED , std : : get < 2 > ( failures [ 0 ] ) ) ;
2022-09-27 17:05:04 -05:00
// EXPECT_EQ(GncQuoteError::QUOTE_FAILED, std::get<2>(failures[1]));
EXPECT_EQ ( 3u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
2022-09-01 14:40:50 -05:00
}
2022-10-13 14:01:36 -05:00
# else
TEST_F ( GncQuotesTest , fq_failure )
{
EXPECT_THROW ( GncQuotes quotes ; , GncQuoteException ) ;
}
2022-09-01 19:11:40 -05:00
# endif
TEST_F ( GncQuotesTest , offline_wiggle )
{
2022-09-10 15:30:15 -05:00
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" EUR \" :{ \" symbol \" : \" EUR \" , \" currency \" : \" USD \" , \" success \" : \" 1 \" , \" inverted \" :0, \" last \" :1.0004}, "
" \" AAPL \" :{ \" eps \" :6.05, \" success \" :1, \" year_range \" : \" 129.04 - 182.94 \" , \" currency \" : \" USD \" , \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" volume \" :73539475, \" close \" :157.22, \" high \" :158.39, \" open \" :156.64, \" div_yield \" :0.5660857, \" last \" :157.96, \" isodate \" : \" 2022-09-01 \" , \" method \" : \" yahoo_json \" , \" name \" : \" AAPL (Apple Inc.) \" , \" pe \" :26.10909, \" low \" :154.67, \" type \" : \" EQUITY \" , \" symbol \" : \" AAPL \" , \" date \" : \" 09/01/2022 \" }, "
" \" HPE \" :{ \" symbol \" : \" HPE \" , \" date \" : \" 09/01/2022 \" , \" low \" :13.13, \" type \" : \" EQUITY \" , \" method \" : \" yahoo_json \" , \" name \" : \" HPE (Hewlett Packard Enterprise Comp) \" , \" isodate \" : \" 2022-09-01 \" , \" pe \" :4.7921147, \" last \" :13.37, \" high \" :13.535, \" close \" :13.6, \" open \" :13.5, \" div_yield \" :3.5294116, \" volume \" :16370483, \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" currency \" : \" USD \" , \" year_range \" : \" 12.4 - 17.76 \" , \" eps \" :2.79, \" success \" :1}, "
" \" FKCM \" :{ \" success \" :0, \" symbol \" : \" FKCM \" , \" errormsg \" : \" Error retrieving quote for FKCM - no listing for this name found. Please check symbol and the two letter extension (if any) \" } "
" } "
2022-09-10 15:30:15 -05:00
} ;
StrVec err_vec ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
2022-09-01 19:11:40 -05:00
quotes . fetch ( m_book ) ;
2022-09-17 13:52:15 -05:00
auto failures { quotes . failures ( ) } ;
ASSERT_EQ ( 1u , failures . size ( ) ) ;
EXPECT_EQ ( GncQuoteError : : QUOTE_FAILED , std : : get < 2 > ( failures [ 0 ] ) ) ;
2022-09-01 19:11:40 -05:00
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
EXPECT_EQ ( 3u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
}
2022-09-12 20:39:18 -05:00
2022-09-27 17:05:04 -05:00
TEST_F ( GncQuotesTest , offline_report )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" AAPL \" :{ \" eps \" :6.05, \" success \" :1, \" year_range \" : \" 129.04 - 182.94 \" , \" currency \" : \" USD \" , \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" volume \" :73539475, \" close \" :157.22, \" high \" :158.39, \" open \" :156.64, \" div_yield \" :0.5660857, \" last \" :157.96, \" isodate \" : \" 2022-09-01 \" , \" method \" : \" yahoo_json \" , \" name \" : \" AAPL (Apple Inc.) \" , \" pe \" :26.10909, \" low \" :154.67, \" type \" : \" EQUITY \" , \" symbol \" : \" AAPL \" , \" date \" : \" 09/01/2022 \" }, "
" \" HPE \" :{ \" symbol \" : \" HPE \" , \" date \" : \" 09/01/2022 \" , \" low \" :13.13, \" type \" : \" EQUITY \" , \" method \" : \" yahoo_json \" , \" name \" : \" HPE (Hewlett Packard Enterprise Comp) \" , \" isodate \" : \" 2022-09-01 \" , \" pe \" :4.7921147, \" last \" :13.37, \" high \" :13.535, \" close \" :13.6, \" open \" :13.5, \" div_yield \" :3.5294116, \" volume \" :16370483, \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" currency \" : \" USD \" , \" year_range \" : \" 12.4 - 17.76 \" , \" eps \" :2.79, \" success \" :1}, "
" \" FKCM \" :{ \" success \" :0, \" symbol \" : \" FKCM \" , \" errormsg \" : \" Error retrieving quote for FKCM - no listing for this name found. Please check symbol and the two letter extension (if any) \" } "
" } "
2022-09-27 17:05:04 -05:00
} ;
StrVec commodities { " AAPL " , " HPE " , " FKCM " } ;
StrVec err_vec ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . report ( " yahoo_json " , commodities , false ) ;
quotes . report ( " yahoo_json " , commodities , true ) ;
}
TEST_F ( GncQuotesTest , offline_currency_report )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" EUR \" :{ \" symbol \" : \" EUR \" , \" currency \" : \" USD \" , \" success \" : \" 1 \" , \" inverted \" :0, \" last \" :1.0004} "
" } "
} ;
2022-09-27 17:05:04 -05:00
StrVec commodities { " USD " , " EUR " } ;
StrVec err_vec ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . report ( " currency " , commodities , false ) ;
quotes . report ( " currency " , commodities , true ) ;
}
2022-09-12 20:39:18 -05:00
TEST_F ( GncQuotesTest , comvec_fetch )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" AAPL \" :{ \" eps \" :6.05, \" success \" :1, \" year_range \" : \" 129.04 - 182.94 \" , \" currency \" : \" USD \" , \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" volume \" :73539475, \" close \" :157.22, \" high \" :158.39, \" open \" :156.64, \" div_yield \" :0.5660857, \" last \" :157.96, \" isodate \" : \" 2022-09-01 \" , \" method \" : \" yahoo_json \" , \" name \" : \" AAPL (Apple Inc.) \" , \" pe \" :26.10909, \" low \" :154.67, \" type \" : \" EQUITY \" , \" symbol \" : \" AAPL \" , \" date \" : \" 09/01/2022 \" }, "
" \" HPE \" :{ \" symbol \" : \" HPE \" , \" date \" : \" 09/01/2022 \" , \" low \" :13.13, \" type \" : \" EQUITY \" , \" method \" : \" yahoo_json \" , \" name \" : \" HPE (Hewlett Packard Enterprise Comp) \" , \" isodate \" : \" 2022-09-01 \" , \" pe \" :4.7921147, \" last \" :13.37, \" high \" :13.535, \" close \" :13.6, \" open \" :13.5, \" div_yield \" :3.5294116, \" volume \" :16370483, \" exchange \" : \" Sourced from Yahoo Finance (as JSON) \" , \" currency \" : \" USD \" , \" year_range \" : \" 12.4 - 17.76 \" , \" eps \" :2.79, \" success \" :1} "
" } "
2022-09-12 20:39:18 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto hpe { gnc_commodity_table_lookup ( commtable , " NYSE " , " HPE " ) } ;
auto aapl { gnc_commodity_table_lookup ( commtable , " NASDAQ " , " AAPL " ) } ;
CommVec comms { hpe , aapl } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( comms ) ;
2022-09-17 13:52:15 -05:00
auto failures { quotes . failures ( ) } ;
EXPECT_TRUE ( failures . empty ( ) ) ;
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
2022-09-12 20:39:18 -05:00
EXPECT_EQ ( 2u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
}
TEST_F ( GncQuotesTest , fetch_one_commodity )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" HPE \" :{ \" date \" : \" 09/01/2022 \" , \" last \" :13.37, \" currency \" : \" USD \" , \" success \" :1} "
" } "
2022-09-12 20:39:18 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto hpe { gnc_commodity_table_lookup ( commtable , " NYSE " , " HPE " ) } ;
auto usd { gnc_commodity_table_lookup ( commtable , " ISO4217 " , " USD " ) } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( hpe ) ;
2022-09-17 13:52:15 -05:00
auto failures { quotes . failures ( ) } ;
EXPECT_TRUE ( failures . empty ( ) ) ;
2022-09-12 20:39:18 -05:00
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
auto price { gnc_pricedb_lookup_latest ( pricedb , hpe , usd ) } ;
auto datetime { static_cast < time64 > ( GncDateTime ( " 20220901160000 " ) ) } ;
EXPECT_EQ ( usd , gnc_price_get_currency ( price ) ) ;
EXPECT_EQ ( datetime , gnc_price_get_time64 ( price ) ) ;
EXPECT_EQ ( PRICE_SOURCE_FQ , gnc_price_get_source ( price ) ) ;
EXPECT_TRUE ( gnc_numeric_equal ( GncNumeric { 1337 , 100 } ,
gnc_price_get_value ( price ) ) ) ;
EXPECT_STREQ ( " Finance::Quote " , gnc_price_get_source_string ( price ) ) ;
EXPECT_STREQ ( " last " , gnc_price_get_typestr ( price ) ) ;
}
TEST_F ( GncQuotesTest , fetch_one_currency )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" EUR \" :{ \" symbol \" : \" EUR \" , \" currency \" : \" USD \" , \" success \" : \" 1 \" , \" inverted \" :0, \" last \" :1.0004} "
" } "
2022-09-12 20:39:18 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto eur { gnc_commodity_table_lookup ( commtable , " ISO4217 " , " EUR " ) } ;
auto usd { gnc_commodity_table_lookup ( commtable , " ISO4217 " , " USD " ) } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( eur ) ;
2022-09-17 13:52:15 -05:00
auto failures { quotes . failures ( ) } ;
EXPECT_TRUE ( failures . empty ( ) ) ;
2022-09-12 20:39:18 -05:00
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
auto price { gnc_pricedb_lookup_latest ( pricedb , eur , usd ) } ;
2022-09-17 13:52:15 -05:00
EXPECT_EQ ( 1u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
2022-09-12 20:39:18 -05:00
auto datetime { static_cast < time64 > ( GncDateTime ( ) ) } ;
EXPECT_EQ ( usd , gnc_price_get_currency ( price ) ) ;
EXPECT_EQ ( datetime , gnc_price_get_time64 ( price ) ) ;
EXPECT_EQ ( PRICE_SOURCE_FQ , gnc_price_get_source ( price ) ) ;
EXPECT_EQ ( 10004 , gnc_price_get_value ( price ) . num ) ;
EXPECT_TRUE ( gnc_numeric_equal ( GncNumeric { 10004 , 10000 } ,
gnc_price_get_value ( price ) ) ) ;
EXPECT_STREQ ( " Finance::Quote " , gnc_price_get_source_string ( price ) ) ;
EXPECT_STREQ ( " last " , gnc_price_get_typestr ( price ) ) ;
}
2022-09-17 13:52:15 -05:00
TEST_F ( GncQuotesTest , no_currency )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" HPE \" :{ \" date \" : \" 09/01/2022 \" , \" last \" :13.37, \" success \" :1} "
" } "
2022-09-17 13:52:15 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto hpe { gnc_commodity_table_lookup ( commtable , " NYSE " , " HPE " ) } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( hpe ) ;
auto failures { quotes . failures ( ) } ;
ASSERT_EQ ( 1u , failures . size ( ) ) ;
EXPECT_EQ ( GncQuoteError : : NO_CURRENCY , std : : get < 2 > ( failures [ 0 ] ) ) ;
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
EXPECT_EQ ( 0u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
}
TEST_F ( GncQuotesTest , bad_currency )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" HPE \" :{ \" date \" : \" 09/01/2022 \" , \" last \" :13.37, \" currency \" : \" BTC \" , \" success \" :1} "
" } "
2022-09-17 13:52:15 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto hpe { gnc_commodity_table_lookup ( commtable , " NYSE " , " HPE " ) } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( hpe ) ;
auto failures { quotes . failures ( ) } ;
ASSERT_EQ ( 1u , failures . size ( ) ) ;
EXPECT_EQ ( GncQuoteError : : UNKNOWN_CURRENCY , std : : get < 2 > ( failures [ 0 ] ) ) ;
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
EXPECT_EQ ( 0u , gnc_pricedb_get_num_prices ( pricedb ) ) ;
}
TEST_F ( GncQuotesTest , no_date )
{
StrVec quote_vec {
2022-10-13 13:24:49 -05:00
" { "
" \" HPE \" :{ \" last \" :13.37, \" currency \" : \" USD \" , \" success \" :1} "
" } "
2022-09-17 13:52:15 -05:00
} ;
StrVec err_vec ;
auto commtable { gnc_commodity_table_get_table ( m_book ) } ;
auto hpe { gnc_commodity_table_lookup ( commtable , " NYSE " , " HPE " ) } ;
auto usd { gnc_commodity_table_lookup ( commtable , " ISO4217 " , " USD " ) } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
quotes . fetch ( hpe ) ;
auto failures { quotes . failures ( ) } ;
EXPECT_TRUE ( failures . empty ( ) ) ;
auto pricedb { gnc_pricedb_get_db ( m_book ) } ;
auto price { gnc_pricedb_lookup_latest ( pricedb , hpe , usd ) } ;
auto datetime { static_cast < time64 > ( GncDateTime ( ) ) } ;
EXPECT_EQ ( usd , gnc_price_get_currency ( price ) ) ;
EXPECT_EQ ( datetime , gnc_price_get_time64 ( price ) ) ;
EXPECT_EQ ( PRICE_SOURCE_FQ , gnc_price_get_source ( price ) ) ;
EXPECT_TRUE ( gnc_numeric_equal ( GncNumeric { 1337 , 100 } ,
gnc_price_get_value ( price ) ) ) ;
EXPECT_STREQ ( " Finance::Quote " , gnc_price_get_source_string ( price ) ) ;
EXPECT_STREQ ( " last " , gnc_price_get_typestr ( price ) ) ;
}
2022-10-13 14:01:36 -05:00
TEST_F ( GncQuotesTest , test_version )
{
StrVec quote_vec , err_vec ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
EXPECT_STREQ ( " 9.99 " , quotes . version ( ) . c_str ( ) ) ;
}
2022-10-13 19:59:14 -05:00
TEST_F ( GncQuotesTest , test_failure_invalid_json )
{
StrVec quote_vec , err_vec { " invalid_json \n " } ;
GncQuotesImpl quotes ( m_book , std : : make_unique < GncMockQuoteSource > ( std : : move ( quote_vec ) , std : : move ( err_vec ) ) ) ;
EXPECT_THROW ( quotes . fetch ( m_book ) , GncQuoteException ) ;
try
{
quotes . fetch ( m_book ) ;
}
catch ( const GncQuoteException & err )
{
EXPECT_STREQ ( " GnuCash submitted invalid json to Finance::Quote. The details were logged. \n " ,
err . what ( ) ) ;
}
}
TEST_F ( GncQuotesTest , test_failure_missing_modules )
{
EXPECT_THROW ( GncQuotesImpl quotes ( m_book , std : : make_unique < GncFailedQuoteSource > ( ) ) ,
GncQuoteSourceError ) ;
try
{
GncQuotesImpl quotes ( m_book , std : : make_unique < GncFailedQuoteSource > ( ) ) ;
}
catch ( const GncQuoteSourceError & err )
{
EXPECT_STREQ ( " Failed to initialize Finance::Quote: missing_modules Mozilla::CA Try::Tiny " ,
err . what ( ) ) ;
}
}