Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

clients/horizonclient: allow Fund on other networks and rely on server to indicate support #3891

Merged
merged 5 commits into from
Sep 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions clients/horizonclient/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
All notable changes to this project will be documented in this
file. This project adheres to [Semantic Versioning](http://semver.org/).

## Unreleased

* The restriction that `Fund` can only be called on the DefaultTestNetClient has
been removed. Any horizonclient.Client may now call Fund. Horizon instances not
supporting Fund will error with a resource not found error.

## [v7.1.1](https://github.com/stellar/go/releases/tag/horizonclient-v7.1.1) - 2021-06-25

* Added transaction and operation result codes to the horizonclient.Error string for easy glancing at string only errors for underlying cause.
Expand Down
6 changes: 3 additions & 3 deletions clients/horizonclient/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -575,11 +575,11 @@ func (c *Client) Trades(request TradeRequest) (tds hProtocol.TradesPage, err err
// Fund creates a new account funded from friendbot. It only works on test networks. See
// https://www.stellar.org/developers/guides/get-started/create-account.html for more information.
func (c *Client) Fund(addr string) (tx hProtocol.Transaction, err error) {
if !c.isTestNet {
return tx, errors.New("can't fund account from friendbot on production network")
}
friendbotURL := fmt.Sprintf("%sfriendbot?addr=%s", c.fixHorizonURL(), addr)
err = c.sendGetRequest(friendbotURL, &tx)
if IsNotFoundError(err) {
return tx, errors.Wrap(err, "funding is only available on test networks and may not be supported by "+c.fixHorizonURL())
}
return
}

Expand Down
24 changes: 23 additions & 1 deletion clients/horizonclient/client_fund_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ func TestFund(t *testing.T) {
client := &Client{
HorizonURL: "https://localhost/",
HTTP: hmock,
isTestNet: true,
}

hmock.On(
Expand All @@ -37,3 +36,26 @@ func TestFund(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, int32(8269), tx.Ledger)
}

func TestFund_notSupported(t *testing.T) {
friendbotFundResponse := `{
"type": "https://stellar.org/horizon-errors/not_found",
"title": "Resource Missing",
"status": 404,
"detail": "The resource at the url requested was not found. This usually occurs for one of two reasons: The url requested is not valid, or no data in our database could be found with the parameters provided."
}`
Shaptic marked this conversation as resolved.
Show resolved Hide resolved

hmock := httptest.NewClient()
client := &Client{
HorizonURL: "https://localhost/",
HTTP: hmock,
}

hmock.On(
"GET",
"https://localhost/friendbot?addr=GBLPP2W3X3PJQXYMC7EFWM5G2QCZL7HTCTFNMONS4ITGAYJ3GNNZIQ4V",
).ReturnString(404, friendbotFundResponse)

_, err := client.Fund("GBLPP2W3X3PJQXYMC7EFWM5G2QCZL7HTCTFNMONS4ITGAYJ3GNNZIQ4V")
assert.EqualError(t, err, "funding is only available on test networks and may not be supported by https://localhost/: horizon error: \"Resource Missing\" - check horizon.Error.Problem for more information")
}
2 changes: 0 additions & 2 deletions clients/horizonclient/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ type Client struct {
// AppVersion is the version of the application using the horizonclient package
AppVersion string
horizonTimeout time.Duration
isTestNet bool

// clock is a Clock returning the current time.
clock *clock.Clock
Expand Down Expand Up @@ -215,7 +214,6 @@ var DefaultTestNetClient = &Client{
HorizonURL: "https://horizon-testnet.stellar.org/",
HTTP: http.DefaultClient,
horizonTimeout: HorizonTimeout,
isTestNet: true,
}

// DefaultPublicNetClient is a default client to connect to public network.
Expand Down