func TestForwardOnlyHandler(t *testing.T) { db := dbtest.Postgres().Load(` CREATE TABLE people (id character varying, name character varying, domain character varying); INSERT INTO people (id, name, domain) VALUES ('GD2GJPL3UOK5LX7TWXOACK2ZPWPFSLBNKL3GTGH6BLBNISK4BGWMFBBG', 'scott', 'stellar.org'), ('GCYMGWPZ6NC2U7SO6SMXOP5ZLXOEC5SYPKITDMVEONLCHFSCCQR2J4S3', 'bartek', 'stellar.org'); `) defer db.Close() driver := &SQLDriver{ DB: db.Open().DB, Dialect: db.Dialect, LookupRecordQuery: "SELECT id FROM people WHERE name = ? AND domain = ?", } defer driver.DB.Close() handler := &Handler{driver} server := httptest.NewServer(t, handler) defer server.Close() // Good forward request server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "scott*stellar.org"). Expect(). Status(http.StatusOK). JSON().Object(). ContainsKey("account_id"). ValueEqual("account_id", "GD2GJPL3UOK5LX7TWXOACK2ZPWPFSLBNKL3GTGH6BLBNISK4BGWMFBBG") // Reverse request server.GET("/federation"). WithQuery("type", "id"). WithQuery("q", "GA3R753JKGXU6ETHNY3U6PYIY7D6UUCXXDYBRF4XURNAGXW3CVGQH2ZA"). Expect(). Status(http.StatusNotImplemented). JSON().Object(). ContainsKey("code"). ValueEqual("code", "not_implemented") }
func TestHandler(t *testing.T) { db := dbtest.Postgres().Load(` CREATE TABLE people (id character varying, name character varying, domain character varying); INSERT INTO people (id, name, domain) VALUES ('GD2GJPL3UOK5LX7TWXOACK2ZPWPFSLBNKL3GTGH6BLBNISK4BGWMFBBG', 'scott', 'stellar.org'), ('GCYMGWPZ6NC2U7SO6SMXOP5ZLXOEC5SYPKITDMVEONLCHFSCCQR2J4S3', 'bartek', 'stellar.org'); `) defer db.Close() driver := &ReverseSQLDriver{ SQLDriver: SQLDriver{ DB: db.Open().DB, Dialect: db.Dialect, LookupRecordQuery: "SELECT id FROM people WHERE name = ? AND domain = ?", }, LookupReverseRecordQuery: "SELECT name, domain FROM people WHERE id = ?", } defer driver.DB.Close() handler := &Handler{driver} server := httptest.NewServer(t, handler) defer server.Close() // Good forward request server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "scott*stellar.org"). Expect(). Status(http.StatusOK). JSON().Object(). ContainsKey("account_id"). ValueEqual("account_id", "GD2GJPL3UOK5LX7TWXOACK2ZPWPFSLBNKL3GTGH6BLBNISK4BGWMFBBG") // No record in DB server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "jed*stellar.org"). Expect(). Status(http.StatusNotFound). JSON().Object(). ContainsKey("code"). ValueEqual("code", "not_found") // Invalid addresses server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "scott**stellar.org"). Expect(). Status(http.StatusBadRequest). JSON().Object(). ContainsKey("code"). ValueEqual("code", "invalid_query") server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "scott"). Expect(). Status(http.StatusBadRequest). JSON().Object(). ContainsKey("code"). ValueEqual("code", "invalid_query") // Missing query server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", ""). Expect(). Status(http.StatusBadRequest). JSON().Object(). ContainsKey("code"). ValueEqual("code", "invalid_request"). ContainsKey("message"). ValueEqual("message", "q parameter is blank") // Different domain server.GET("/federation"). WithQuery("type", "name"). WithQuery("q", "scott*example.com"). Expect(). Status(http.StatusNotFound). JSON().Object(). ContainsKey("code"). ValueEqual("code", "not_found") // Reverse federation questions // Good request server.GET("/federation"). WithQuery("type", "id"). WithQuery("q", "GD2GJPL3UOK5LX7TWXOACK2ZPWPFSLBNKL3GTGH6BLBNISK4BGWMFBBG"). Expect(). Status(http.StatusOK). JSON().Object(). ContainsKey("stellar_address"). ValueEqual("stellar_address", "scott*stellar.org") // No record in DB server.GET("/federation"). WithQuery("type", "id"). WithQuery("q", "GA3R753JKGXU6ETHNY3U6PYIY7D6UUCXXDYBRF4XURNAGXW3CVGQH2ZA"). Expect(). Status(http.StatusNotFound). JSON().Object(). ContainsKey("code"). ValueEqual("code", "not_found") // TXID request server.GET("/federation"). WithQuery("type", "txid"). WithQuery("q", "hello"). Expect(). Status(http.StatusNotImplemented). JSON().Object(). ContainsKey("code"). ValueEqual("code", "not_implemented") // Invalid type server.GET("/federation"). WithQuery("type", "foo"). WithQuery("q", "hello"). Expect(). Status(http.StatusBadRequest). JSON().Object(). ContainsKey("code"). ValueEqual("code", "invalid_request") }
func TestRepo(t *testing.T) { db := dbtest.Postgres().Load(testSchema) defer db.Close() assert := assert.New(t) require := require.New(t) repo := &Repo{DB: db.Open()} defer repo.DB.Close() var count int err := repo.GetRaw(&count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(3, count) var names []string err = repo.SelectRaw(&names, "SELECT name FROM people") assert.NoError(err) assert.Len(names, 3) ret, err := repo.ExecRaw("DELETE FROM people") assert.NoError(err) deleted, err := ret.RowsAffected() assert.NoError(err) assert.Equal(int64(3), deleted) // Test args db.Load(testSchema) var name string err = repo.GetRaw( &name, "SELECT name FROM people WHERE hunger_level = ?", 1000000, ) assert.NoError(err) assert.Equal("scott", name) // Test NoRows err = repo.GetRaw( &name, "SELECT name FROM people WHERE hunger_level = ?", 1234, ) assert.True(repo.NoRows(err)) // Test transactions db.Load(testSchema) require.NoError(repo.Begin(), "begin failed") err = repo.GetRaw(&count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(3, count) _, err = repo.ExecRaw("DELETE FROM people") assert.NoError(err) err = repo.GetRaw(&count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(0, count, "people did not appear deleted inside transaction") assert.NoError(repo.Rollback(), "rollback failed") // Ensure commit works require.NoError(repo.Begin(), "begin failed") repo.ExecRaw("DELETE FROM people") assert.NoError(repo.Commit(), "commit failed") err = repo.GetRaw(&count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(0, count) // ensure that selecting into a populated slice clears the slice first db.Load(testSchema) require.Len(names, 3, "ids slice was not preloaded with data") err = repo.SelectRaw(&names, "SELECT name FROM people limit 2") assert.NoError(err) assert.Len(names, 2) }