MCPcopy Create free account
hub / github.com/couchbase/sync_gateway / TestUserJoiningPopulatedChannel

Function TestUserJoiningPopulatedChannel

rest/changes_test.go:89–164  ·  view source on GitHub ↗

Test for wrong _changes entries for user joining a populated channel

(t *testing.T)

Source from the content-addressed store, hash-verified

87
88// Test for wrong _changes entries for user joining a populated channel
89func TestUserJoiningPopulatedChannel(t *testing.T) {
90
91 base.SetUpTestLogging(t, base.LevelInfo, base.KeyCache, base.KeyAccess, base.KeyCRUD, base.KeyChanges)
92
93 rtConfig := RestTesterConfig{
94 SyncFn: `function(doc) {channel(doc.channels)}`,
95 }
96 rt := NewRestTester(t, &rtConfig)
97 defer rt.Close()
98
99 ctx := rt.Context()
100 a := rt.ServerContext().Database(ctx, "db").Authenticator(ctx)
101 guest, err := a.GetUser("")
102 assert.NoError(t, err)
103 guest.SetDisabled(false)
104 assert.NoError(t, a.Save(guest))
105
106 rt.CreateUser("user1", []string{"alpha"})
107
108 // Create 100 docs
109 for i := 0; i < 100; i++ {
110 docpath := fmt.Sprintf("/{{.keyspace}}/doc%d", i)
111 RequireStatus(t, rt.SendRequest("PUT", docpath, `{"foo": "bar", "channels":["alpha"]}`), 201)
112 }
113
114 limit := 50
115 changesResults := rt.WaitForChanges(50, fmt.Sprintf("/{{.keyspace}}/_changes?limit=%d", limit), "user1", false)
116 since := changesResults.Results[49].Seq
117 assert.Equal(t, "doc48", changesResults.Results[49].ID)
118
119 // // Check the _changes feed with since and limit, to get second half of feed
120 changesResults = rt.WaitForChanges(50, fmt.Sprintf("/{{.keyspace}}/_changes?since=\"%s\"&limit=%d", since, limit), "user1", false)
121 assert.Equal(t, "doc98", changesResults.Results[49].ID)
122
123 rt.CreateUser("user2", []string{"alpha"})
124
125 // Retrieve all changes for user2 with no limits
126 changesResults = rt.WaitForChanges(101, fmt.Sprintf("/{{.keyspace}}/_changes"), "user2", false)
127 assert.Equal(t, "doc99", changesResults.Results[99].ID)
128
129 rt.CreateUser("user3", []string{"alpha"})
130
131 getUserResponse := rt.SendAdminRequest("GET", "/db/_user/user3", "")
132 RequireStatus(t, getUserResponse, 200)
133 log.Printf("create user response: %s", getUserResponse.Body.Bytes())
134
135 // Get the sequence from the user doc to validate against the triggered by value in the changes results
136 user3, _ := rt.GetDatabase().Authenticator(base.TestCtx(t)).GetUser("user3")
137 userSequence := user3.Sequence()
138
139 // Get first 50 document changes.
140 changesResults = rt.WaitForChanges(50, fmt.Sprintf("/{{.keyspace}}/_changes?limit=%d", limit), "user3", false)
141 since = changesResults.Results[49].Seq
142 assert.Equal(t, "doc49", changesResults.Results[49].ID)
143 assert.Equal(t, userSequence, since.TriggeredBy)
144
145 // // Get remainder of changes i.e. no limit parameter
146 changesResults = rt.WaitForChanges(51, fmt.Sprintf("/{{.keyspace}}/_changes?since=\"%s\"", since), "user3", false)

Callers

nothing calls this directly

Calls 15

CloseMethod · 0.95
ContextMethod · 0.95
ServerContextMethod · 0.95
CreateUserMethod · 0.95
SendRequestMethod · 0.95
WaitForChangesMethod · 0.95
SendAdminRequestMethod · 0.95
GetDatabaseMethod · 0.95
SetUpTestLoggingFunction · 0.92
TestCtxFunction · 0.92
NewRestTesterFunction · 0.85
RequireStatusFunction · 0.85

Tested by

no test coverage detected