mirror of
https://github.com/ChronosX88/go-gun.git
synced 2024-11-09 12:41:00 +00:00
135 lines
4.0 KiB
Go
135 lines
4.0 KiB
Go
package tests
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/ChronosX88/go-gun/gun"
|
|
)
|
|
|
|
func TestGunGetSimple(t *testing.T) {
|
|
// Run the server, put in one call, get in another, then check
|
|
ctx, cancelFn := newContext(t)
|
|
defer cancelFn()
|
|
serverCancelFn := ctx.startGunJSServer()
|
|
defer serverCancelFn()
|
|
randStr := randString(30)
|
|
// Write w/ JS
|
|
ctx.runJSWithGun(`
|
|
gun.get('esgopeta-test').get('TestGunGetSimple').get('some-field').put('` + randStr + `', ack => {
|
|
if (ack.err) {
|
|
console.error(ack.err)
|
|
process.exit(1)
|
|
}
|
|
process.exit(0)
|
|
})
|
|
`)
|
|
// Get
|
|
g := ctx.newGunConnectedToGunJS()
|
|
defer g.Close()
|
|
// Make sure we got back the same value
|
|
r := g.Scoped(ctx, "esgopeta-test", "TestGunGetSimple", "some-field").FetchOne(ctx)
|
|
ctx.Require.NoError(r.Err)
|
|
ctx.Require.Equal(gun.ValueString(randStr), r.Value.(gun.ValueString))
|
|
// Do it again with the JS server closed since it should fetch from memory
|
|
serverCancelFn()
|
|
ctx.debugf("Asking for field again")
|
|
r = g.Scoped(ctx, "esgopeta-test", "TestGunGetSimple", "some-field").FetchOne(ctx)
|
|
ctx.Require.NoError(r.Err)
|
|
ctx.Require.Equal(gun.ValueString(randStr), r.Value.(gun.ValueString))
|
|
}
|
|
|
|
func TestGunGetSimpleRemote(t *testing.T) {
|
|
// Do the above but w/ remote server
|
|
ctx, cancelFn := newContext(t)
|
|
defer cancelFn()
|
|
remoteURL := ctx.prepareRemoteGunServer(defaultRemoteGunServerURL)
|
|
randField, randVal := "field-"+randString(30), gun.ValueString(randString(30))
|
|
// Write w/ JS
|
|
ctx.debugf("Writing value")
|
|
ctx.runJSWithGunURL(remoteURL, `
|
|
gun.get('esgopeta-test').get('TestGunGetSimpleRemote').get('`+randField+`').put('`+string(randVal)+`', ack => {
|
|
if (ack.err) {
|
|
console.error(ack.err)
|
|
process.exit(1)
|
|
}
|
|
process.exit(0)
|
|
})
|
|
`)
|
|
// Get
|
|
ctx.debugf("Reading value")
|
|
g := ctx.newGunConnectedToGunServer(remoteURL)
|
|
defer g.Close()
|
|
// Make sure we got back the same value
|
|
r := g.Scoped(ctx, "esgopeta-test", "TestGunGetSimpleRemote", randField).FetchOne(ctx)
|
|
ctx.Require.NoError(r.Err)
|
|
ctx.Require.Equal(randVal, r.Value)
|
|
}
|
|
|
|
func TestGunPutSimple(t *testing.T) {
|
|
ctx, cancelFn := newContextWithGunJServer(t)
|
|
defer cancelFn()
|
|
randStr := randString(30)
|
|
// Put
|
|
g := ctx.newGunConnectedToGunJS()
|
|
defer g.Close()
|
|
// Just wait for two acks (one local, one remote)
|
|
ch := g.Scoped(ctx, "esgopeta-test", "TestGunPutSimple", "some-field").Put(ctx, gun.ValueString(randStr))
|
|
// TODO: test local is null peer and remote is non-null
|
|
r := <-ch
|
|
ctx.Require.NoError(r.Err)
|
|
r = <-ch
|
|
ctx.Require.NoError(r.Err)
|
|
// Get from JS
|
|
out := ctx.runJSWithGun(`
|
|
gun.get('esgopeta-test').get('TestGunPutSimple').get('some-field').once(data => {
|
|
console.log(data)
|
|
process.exit(0)
|
|
})
|
|
`)
|
|
ctx.Require.Equal(randStr, strings.TrimSpace(string(out)))
|
|
}
|
|
|
|
func TestGunPubSubSimpleRemote(t *testing.T) {
|
|
ctx, cancelFn := newContext(t)
|
|
defer cancelFn()
|
|
remoteURL := ctx.prepareRemoteGunServer(defaultRemoteGunServerURL)
|
|
randField, randVal := "field-"+randString(30), gun.ValueString(randString(30))
|
|
// Start a fetcher
|
|
ctx.debugf("Starting fetcher")
|
|
fetchGun := ctx.newGunConnectedToGunServer(remoteURL)
|
|
defer fetchGun.Close()
|
|
fetchCh := fetchGun.Scoped(ctx, "esgopeta-test", "TestGunPubSubSimpleRemote", randField).Fetch(ctx)
|
|
// Now put it from another instance
|
|
ctx.debugf("Putting data")
|
|
putGun := ctx.newGunConnectedToGunServer(remoteURL)
|
|
defer putGun.Close()
|
|
putScope := putGun.Scoped(ctx, "esgopeta-test", "TestGunPubSubSimpleRemote", randField)
|
|
putScope.Put(ctx, randVal)
|
|
ctx.debugf("Checking fetcher")
|
|
// See that the fetch got the value
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
ctx.Require.NoError(ctx.Err())
|
|
case result := <-fetchCh:
|
|
ctx.Require.NoError(result.Err)
|
|
if !result.ValueExists {
|
|
ctx.debugf("No value, trying again (got %v)", result)
|
|
continue
|
|
}
|
|
ctx.Require.Equal(randVal, result.Value)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
TODO Tests to write:
|
|
* test put w/ future state happens then
|
|
* test put w/ old state is discarded
|
|
* test put w/ new state is persisted
|
|
* test put w/ same state but greater is persisted
|
|
* test put w/ same state but less is discarded
|
|
*/
|