Skip to content

Supporting multiple instance of parse server #10

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
60 changes: 45 additions & 15 deletions common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,44 +10,74 @@ import (
)

type ctxT struct {
ts *httptest.Server
oldHost string
oldHttpClient *http.Client
ts1 *httptest.Server
oldHost1 string
oldHttpClient1 *http.Client

ts2 *httptest.Server
oldHost2 string
oldHttpClient2 *http.Client
}

var ctx = ctxT{}

func setupTestServer(handler http.HandlerFunc) *httptest.Server {
ts := httptest.NewTLSServer(handler)
ctx.ts = ts
func setupTestServer(handler http.HandlerFunc) (*httptest.Server, *httptest.Server) {
ts1 := httptest.NewTLSServer(handler)
ctx.ts1 = ts1

_url, err := url.Parse(ts.URL)
_url1, err := url.Parse(ts1.URL)
if err != nil {
panic(err)
}

ctx.oldHost = parseHost
ctx.oldHttpClient = defaultClient.httpClient
ctx.oldHost1 = apps["app_id"].parseHost
ctx.oldHttpClient1 = apps["app_id"].httpClient
apps["app_id"].parseHost = _url1.Host
apps["app_id"].httpClient = &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
}

ts2 := httptest.NewTLSServer(handler)
ctx.ts2 = ts2

parseHost = _url.Host
defaultClient.httpClient = &http.Client{
_url2, err := url.Parse(ts2.URL)
if err != nil {
panic(err)
}

ctx.oldHost2 = apps["app_id_2"].parseHost
ctx.oldHttpClient2 = apps["app_id_2"].httpClient
apps["app_id_2"].parseHost = _url2.Host
apps["app_id_2"].httpClient = &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
}

return ts
return ts1, ts2
}

func teardownTestServer() {
ctx.ts.Close()
parseHost = ctx.oldHost
defaultClient.httpClient = ctx.oldHttpClient
ctx.ts1.Close()
ctx.ts2.Close()

apps["app_id"].parseHost = ctx.oldHost1
apps["app_id"].httpClient = ctx.oldHttpClient1
apps["app_id_2"].parseHost = ctx.oldHost2
apps["app_id_2"].httpClient = ctx.oldHttpClient2
}

func TestMain(m *testing.M) {
Initialize("app_id", "rest_key", "master_key")
ServerURL("https://api.parse.com/1/")

Initialize("app_id_2", "rest_key_2", "master_key_2")
ServerURL("https://api.parse.com/2/")
os.Exit(m.Run())
}
8 changes: 4 additions & 4 deletions create.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ func (c *createT) method() string {
func (c *createT) endpoint() (string, error) {
p := getEndpointBase(c.v)
u := url.URL{}
u.Scheme = ParseScheme
u.Host = parseHost
u.Scheme = apps[selectedAppId].parseScheme
u.Host = apps[selectedAppId].parseHost
u.Path = p

return u.String(), nil
Expand Down Expand Up @@ -109,7 +109,7 @@ func Signup(username string, password string, user interface{}) error {
username: username,
password: password,
}
if b, err := defaultClient.doRequest(cr); err != nil {
if b, err := apps[selectedAppId].doRequest(cr); err != nil {
return err
} else {
return handleResponse(b, user)
Expand All @@ -127,7 +127,7 @@ func create(v interface{}, useMasterKey bool, currentSession *sessionT) error {
shouldUseMasterKey: useMasterKey,
currentSession: currentSession,
}
if b, err := defaultClient.doRequest(cr); err != nil {
if b, err := apps[selectedAppId].doRequest(cr); err != nil {
return err
} else {
return handleResponse(b, v)
Expand Down
47 changes: 47 additions & 0 deletions create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,53 @@ func TestCreate(t *testing.T) {
}
}

func TestCreateOnNonDefaultInitializedServer(t *testing.T) {
setupTestServer(func(w http.ResponseWriter, r *http.Request) {
if h := r.Header.Get(AppIdHeader); h != "app_id_2" {
t.Errorf("request did not have App ID header set!")
}

if h := r.Header.Get(RestKeyHeader); h != "rest_key_2" {
t.Errorf("request did not have Rest Key header set!")
}

if h := r.Header.Get(SessionTokenHeader); h != "" {
t.Errorf("request had Session Token header set!")
}

if h := r.Header.Get(MasterKeyHeader); h != "" {
t.Errorf("request had Master Key header set!")
}

fmt.Fprintf(w, `{"createdAt":"2021-12-19T18:05:57Z","objectId":"abcDEFG"}`)
})
defer teardownTestServer()

u := TestUser{
FirstName: "Kyle",
LastName: "M",
Email: "kylemcc@gmail.com",
FCount: 11,
}

AppConnectionWrapper("app_id_2", func() {
err := Create(&u, false)

if err != nil {
t.Errorf("Unexpected error creating object: %v\n", err)
t.FailNow()
}

if u.Id != "abcDEFG" {
t.Errorf("Create did not set proper id on instance. u.Id: %v\n", u.Id)
}

if u.CreatedAt != time.Date(2021, 12, 19, 18, 5, 57, 0, time.UTC) {
t.Errorf("Create did not set proper createdAt date. u.CreatedAt: %v\n", u.CreatedAt)
}
})
}

func TestCreateUseMasterKey(t *testing.T) {
setupTestServer(func(w http.ResponseWriter, r *http.Request) {
if h := r.Header.Get(AppIdHeader); h != "app_id" {
Expand Down
6 changes: 3 additions & 3 deletions delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func _delete(v interface{}, useMasterKey bool, currentSession *sessionT) error {
return errors.New("v must be a non-nil pointer")
}

_, err := defaultClient.doRequest(&deleteT{inst: v, shouldUseMasterKey: useMasterKey, currentSession: currentSession})
_, err := apps[selectedAppId].doRequest(&deleteT{inst: v, shouldUseMasterKey: useMasterKey, currentSession: currentSession})
return err
}

Expand Down Expand Up @@ -50,8 +50,8 @@ func (d *deleteT) endpoint() (string, error) {

p := getEndpointBase(d.inst)
u := url.URL{}
u.Scheme = ParseScheme
u.Host = parseHost
u.Scheme = apps[selectedAppId].parseScheme
u.Host = apps[selectedAppId].parseHost
u.Path = path.Join(p, id)

return u.String(), nil
Expand Down
39 changes: 39 additions & 0 deletions delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,42 @@ func TestDelete(t *testing.T) {
u := User{Base: Base{Id: "abc"}}
Delete(&u, false)
}

func TestDeleteOnNonDefaultInitializedServer(t *testing.T) {
shouldHaveMasterKey := false
setupTestServer(func(w http.ResponseWriter, r *http.Request) {
if h := r.Header.Get(AppIdHeader); h != "app_id_2" {
t.Errorf("request did not have App ID header set!")
}

if h := r.Header.Get(SessionTokenHeader); h != "" {
t.Errorf("request had Session Token header set!")
}

if shouldHaveMasterKey {
if h := r.Header.Get(RestKeyHeader); h != "" {
t.Errorf("request had Rest Key header set!")
}

if h := r.Header.Get(MasterKeyHeader); h != "master_key_2" {
t.Errorf("request did not have Master Key header set!")
}
} else {
if h := r.Header.Get(RestKeyHeader); h != "rest_key_2" {
t.Errorf("request did not have Rest Key header set!")
}

if h := r.Header.Get(MasterKeyHeader); h != "" {
t.Errorf("request had Master Key header set!")
}
}

fmt.Fprintf(w, "")
})
defer teardownTestServer()

u := User{Base: Base{Id: "abc"}}
AppConnectionWrapper("app_id_2", func() {
Delete(&u, false)
})
}
8 changes: 4 additions & 4 deletions function.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ func (c *callFnT) method() string {
}

func (c *callFnT) endpoint() (string, error) {
p := path.Join(ParsePath, "functions", c.name)
p := path.Join(apps[selectedAppId].parsePath, "functions", c.name)
u := url.URL{}
u.Scheme = ParseScheme
u.Host = parseHost
u.Scheme = apps[selectedAppId].parseScheme
u.Host = apps[selectedAppId].parseHost
u.Path = p

return u.String(), nil
Expand Down Expand Up @@ -70,7 +70,7 @@ func callFn(name string, params Params, resp interface{}, currentSession *sessio
params: params,
currentSession: currentSession,
}
if b, err := defaultClient.doRequest(cr); err != nil {
if b, err := apps[selectedAppId].doRequest(cr); err != nil {
return err
} else {
r := fnRespT{}
Expand Down
8 changes: 4 additions & 4 deletions push.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ func (p *pushT) method() string {

func (p *pushT) endpoint() (string, error) {
u := url.URL{}
u.Scheme = ParseScheme
u.Host = parseHost
u.Path = "/" + ParsePath + "/push"
u.Scheme = apps[selectedAppId].parseScheme
u.Host = apps[selectedAppId].parseHost
u.Path = "/" + apps[selectedAppId].parsePath + "/push"

return u.String(), nil
}
Expand Down Expand Up @@ -144,7 +144,7 @@ func (p *pushT) Data(d map[string]interface{}) PushNotification {
}

func (p *pushT) Send() error {
b, err := defaultClient.doRequest(p)
b, err := apps[selectedAppId].doRequest(p)
data := map[string]interface{}{}
if err := json.Unmarshal(b, &data); err != nil {
return err
Expand Down
16 changes: 8 additions & 8 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ func (q *queryT) UseMasterKey() Query {
func (q *queryT) Get(id string) error {
q.op = otGet
q.instId = &id
if body, err := defaultClient.doRequest(q); err != nil {
if body, err := apps[selectedAppId].doRequest(q); err != nil {
return err
} else {
return handleResponse(body, q.inst)
Expand Down Expand Up @@ -785,7 +785,7 @@ func (q *queryT) Each(rc interface{}) (*Iterator, error) {
s.Elem().Set(reflect.MakeSlice(sliceType, 0, 100))

// TODO: handle errors and retry if possible
b, err := defaultClient.doRequest(q)
b, err := apps[selectedAppId].doRequest(q)
if err != nil {
i.err = err
i.resChan <- err
Expand Down Expand Up @@ -836,7 +836,7 @@ func (q *queryT) SetBatchSize(size uint) Query {

func (q *queryT) Find() error {
q.op = otQuery
if b, err := defaultClient.doRequest(q); err != nil {
if b, err := apps[selectedAppId].doRequest(q); err != nil {
return err
} else {
return handleResponse(b, q.inst)
Expand All @@ -855,7 +855,7 @@ func (q *queryT) First() error {
dv := reflect.New(reflect.SliceOf(rvi.Type()))
dv.Elem().Set(reflect.MakeSlice(reflect.SliceOf(rvi.Type()), 0, 1))

if b, err := defaultClient.doRequest(q); err != nil {
if b, err := apps[selectedAppId].doRequest(q); err != nil {
return err
} else if err := handleResponse(b, dv.Interface()); err != nil {
return err
Expand All @@ -866,7 +866,7 @@ func (q *queryT) First() error {
rv.Elem().Set(dv.Elem().Index(0))
}
} else if rvi.Kind() == reflect.Slice {
if b, err := defaultClient.doRequest(q); err != nil {
if b, err := apps[selectedAppId].doRequest(q); err != nil {
return err
} else if err := handleResponse(b, q.inst); err != nil {
return err
Expand All @@ -884,7 +884,7 @@ func (q *queryT) Count() (int64, error) {
q.count = &c

var count int64
if b, err := defaultClient.doRequest(q); err != nil {
if b, err := apps[selectedAppId].doRequest(q); err != nil {
return 0, err
} else {
err := handleResponse(b, &count)
Expand Down Expand Up @@ -959,8 +959,8 @@ func (q *queryT) endpoint() (string, error) {
return "", err
}

u.Scheme = ParseScheme
u.Host = parseHost
u.Scheme = apps[selectedAppId].parseScheme
u.Host = apps[selectedAppId].parseHost
u.RawQuery = qs
u.Path = p

Expand Down
26 changes: 26 additions & 0 deletions query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,32 @@ func TestCount(t *testing.T) {
}
}

func TestCountOnNonDefaultInitializedServer(t *testing.T) {
setupTestServer(func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
fmt.Fprintf(w, `{"results":[],"count":73}`)
})
defer teardownTestServer()

AppConnectionWrapper("app_id_2", func() {
q, err := NewQuery(&User{})
if err != nil {
t.Errorf("Unexpected error creating query: %v\n", err)
t.FailNow()
}

q.EqualTo("city", "Chicago")
cnt, err := q.Count()
if err != nil {
t.Errorf("Error running query: %v\n", err)
}

if cnt != 73 {
t.Errorf("Count returned incorrect value. Got [%d] expected [%d]\n", cnt, 73)
}
})
}

func TestFind(t *testing.T) {
setupTestServer(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `{"results":[{"objectId": "123", "createdAt":"2012-04-14T19:23:10.123Z"},{"objectId":"abc","createdAt":"2012-04-14T19:23:10.123Z"}]}`)
Expand Down
Loading