Test for wrong _changes entries for user joining a populated channel
(t *testing.T)
| 87 | |
| 88 | // Test for wrong _changes entries for user joining a populated channel |
| 89 | func 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) |
nothing calls this directly
no test coverage detected