github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/document_replication_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 9 ravendb "github.com/altipla-consulting/ravendb-go-client" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func documentReplication_canReplicateDocument(t *testing.T, driver *RavenTestDriver) { 14 driver.customize = func(r *ravendb.DatabaseRecord) { 15 conflictSolver := &ravendb.ConflictSolver{ 16 ResolveToLatest: false, 17 ResolveByCollection: map[string]*ravendb.ScriptResolver{}, 18 } 19 r.ConflictSolverConfig = conflictSolver 20 } 21 defer func() { 22 driver.customize = nil 23 }() 24 25 var err error 26 source := driver.getDocumentStoreMust(t) 27 defer source.Close() 28 29 destination := driver.getDocumentStoreMust(t) 30 defer destination.Close() 31 32 driver.setupReplication(source, destination) 33 var id string 34 35 { 36 session := openSessionMust(t, source) 37 38 user := &User{} 39 user.setName("Arek") 40 41 err = session.Store(user) 42 assert.NoError(t, err) 43 err = session.SaveChanges() 44 assert.NoError(t, err) 45 46 id = user.ID 47 48 session.Close() 49 } 50 var fetchedUser *User 51 err = driver.waitForDocumentToReplicate(destination, &fetchedUser, id, time.Millisecond*10000) 52 assert.NoError(t, err) 53 assert.Equal(t, *fetchedUser.Name, "Arek") 54 } 55 56 func documentReplication_getConflictsResult_command_should_work_properly(t *testing.T, driver *RavenTestDriver) { 57 driver.customize = func(r *ravendb.DatabaseRecord) { 58 conflictSolver := &ravendb.ConflictSolver{ 59 ResolveToLatest: false, 60 ResolveByCollection: map[string]*ravendb.ScriptResolver{}, 61 } 62 r.ConflictSolverConfig = conflictSolver 63 } 64 defer func() { 65 driver.customize = nil 66 }() 67 68 var err error 69 source := driver.getDocumentStoreMust(t) 70 defer source.Close() 71 72 destination := driver.getDocumentStoreMust(t) 73 defer destination.Close() 74 75 { 76 session := openSessionMust(t, source) 77 78 user1 := &User{} 79 user1.setName("Value") 80 81 err = session.StoreWithID(user1, "docs/1") 82 assert.NoError(t, err) 83 err = session.SaveChanges() 84 assert.NoError(t, err) 85 86 session.Close() 87 } 88 89 { 90 session := openSessionMust(t, destination) 91 92 user1 := &User{} 93 user1.setName("Value2") 94 95 err = session.StoreWithID(user1, "docs/1") 96 assert.NoError(t, err) 97 err = session.SaveChanges() 98 assert.NoError(t, err) 99 100 session.Close() 101 } 102 103 driver.setupReplication(source, destination) 104 105 { 106 session := openSessionMust(t, source) 107 108 user1 := &User{} 109 user1.setName("marker") 110 111 err = session.StoreWithID(user1, "marker") 112 assert.NoError(t, err) 113 err = session.SaveChanges() 114 assert.NoError(t, err) 115 116 session.Close() 117 } 118 119 var user *User 120 err = driver.waitForDocumentToReplicate(destination, &user, "marker", time.Millisecond*2090) 121 assert.NoError(t, err) 122 123 command := ravendb.NewGetConflictsCommand("docs/1") 124 err = destination.GetRequestExecutor("").ExecuteCommand(command, nil) 125 assert.NoError(t, err) 126 results := command.Result.Results 127 assert.Equal(t, len(results), 2) 128 assert.NotEqual(t, results[0].ChangeVector, results[1].ChangeVector) 129 } 130 131 func documentReplication_shouldCreateConflictThenResolveIt(t *testing.T, driver *RavenTestDriver) { 132 driver.customize = func(r *ravendb.DatabaseRecord) { 133 conflictSolver := &ravendb.ConflictSolver{ 134 ResolveToLatest: false, 135 ResolveByCollection: map[string]*ravendb.ScriptResolver{}, 136 } 137 r.ConflictSolverConfig = conflictSolver 138 } 139 defer func() { 140 driver.customize = nil 141 }() 142 143 var err error 144 source := driver.getDocumentStoreMust(t) 145 defer source.Close() 146 147 destination := driver.getDocumentStoreMust(t) 148 defer destination.Close() 149 150 { 151 session := openSessionMust(t, source) 152 153 user1 := &User{} 154 user1.setName("Value") 155 156 err = session.StoreWithID(user1, "docs/1") 157 assert.NoError(t, err) 158 err = session.SaveChanges() 159 assert.NoError(t, err) 160 161 session.Close() 162 } 163 164 { 165 session := openSessionMust(t, destination) 166 167 user1 := &User{} 168 user1.setName("Value2") 169 170 err = session.StoreWithID(user1, "docs/1") 171 assert.NoError(t, err) 172 err = session.SaveChanges() 173 assert.NoError(t, err) 174 175 session.Close() 176 } 177 178 driver.setupReplication(source, destination) 179 180 { 181 session := openSessionMust(t, source) 182 183 user1 := &User{} 184 user1.setName("marker") 185 186 err = session.StoreWithID(user1, "marker") 187 assert.NoError(t, err) 188 err = session.SaveChanges() 189 assert.NoError(t, err) 190 191 session.Close() 192 } 193 194 var user *User 195 err = driver.waitForDocumentToReplicate(destination, &user, "marker", time.Millisecond*2090) 196 assert.NoError(t, err) 197 198 command := ravendb.NewGetConflictsCommand("docs/1") 199 err = destination.GetRequestExecutor("").ExecuteCommand(command, nil) 200 assert.NoError(t, err) 201 results := command.Result.Results 202 assert.Equal(t, len(results), 2) 203 assert.NotEqual(t, results[0].ChangeVector, results[1].ChangeVector) 204 205 { 206 session := openSessionMust(t, destination) 207 208 var user1 *User 209 err = session.Load(&user1, "docs/1") 210 assert.Error(t, err) 211 _, ok := err.(*ravendb.DocumentConflictError) 212 if !ok { 213 fmt.Printf("error is '%s' of type %T\n", err, err) 214 } 215 assert.True(t, ok) 216 217 session.Close() 218 } 219 220 //now actually resolve the conflict 221 //(resolve by using first variant) 222 putCommand := ravendb.NewPutDocumentCommand("docs/1", nil, results[0].Doc) 223 err = destination.GetRequestExecutor("").ExecuteCommand(putCommand, nil) 224 assert.NoError(t, err) 225 226 { 227 session := openSessionMust(t, destination) 228 229 var loadedUser *User 230 err = session.Load(&loadedUser, "docs/1") 231 assert.NoError(t, err) 232 name, ok := jsonGetAsText(results[0].Doc, "name") 233 assert.True(t, ok) 234 assert.Equal(t, *loadedUser.Name, name) 235 236 session.Close() 237 } 238 } 239 240 func enableReplicationTests() bool { 241 if os.Getenv("RAVEN_License") != "" { 242 return true 243 } 244 if os.Getenv("RAVEN_License_Path") != "" { 245 return true 246 } 247 return false 248 } 249 250 func TestDocumentReplication(t *testing.T) { 251 driver := createTestDriver(t) 252 destroy := func() { destroyDriver(t, driver) } 253 defer recoverTest(t, destroy) 254 255 if !enableReplicationTests() { 256 fmt.Printf("Skipping TestDocumentReplication because RAVEN_License env variable is not set\n") 257 return 258 } 259 260 // TODO: ensure order matches Java's order 261 documentReplication_canReplicateDocument(t, driver) 262 documentReplication_getConflictsResult_command_should_work_properly(t, driver) 263 documentReplication_shouldCreateConflictThenResolveIt(t, driver) 264 }