github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/advanced_patching_test.go (about) 1 package tests 2 3 import ( 4 "testing" 5 "time" 6 7 ravendb "github.com/altipla-consulting/ravendb-go-client" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 type CustomType struct { 12 ID string 13 Owner string `json:"owner"` 14 Value int `json:"value"` 15 Comments []string `json:"comments"` 16 Date time.Time `json:"date"` 17 } 18 19 func advancedPatchingTestWithVariables(t *testing.T, driver *RavenTestDriver) { 20 var err error 21 store := driver.getDocumentStoreMust(t) 22 defer store.Close() 23 24 { 25 session := openSessionMust(t, store) 26 27 customType := &CustomType{ 28 Owner: "me", 29 } 30 err = session.StoreWithID(customType, "customTypes/1") 31 assert.NoError(t, err) 32 err = session.SaveChanges() 33 assert.NoError(t, err) 34 35 session.Close() 36 } 37 38 patchRequest := &ravendb.PatchRequest{} 39 patchRequest.Script = "this.owner = args.v1" 40 m := map[string]interface{}{ 41 "v1": "not-me", 42 } 43 patchRequest.Values = m 44 patchOperation, err := ravendb.NewPatchOperation("customTypes/1", nil, patchRequest, nil, false) 45 assert.NoError(t, err) 46 err = store.Operations().Send(patchOperation, nil) 47 assert.NoError(t, err) 48 49 { 50 session := openSessionMust(t, store) 51 var loaded *CustomType 52 err = session.Load(&loaded, "customTypes/1") 53 assert.NoError(t, err) 54 assert.Equal(t, loaded.Owner, "not-me") 55 56 session.Close() 57 } 58 } 59 60 func advancedPatchingCanCreateDocumentsIfPatchingAppliedByIndex(t *testing.T, driver *RavenTestDriver) { 61 var err error 62 store := driver.getDocumentStoreMust(t) 63 defer store.Close() 64 65 { 66 newSession := openSessionMust(t, store) 67 type1 := &CustomType{ 68 ID: "Item/1", 69 Value: 1, 70 } 71 72 type2 := &CustomType{ 73 ID: "Item/2", 74 Value: 2, 75 } 76 77 err = newSession.Store(type1) 78 assert.NoError(t, err) 79 err = newSession.Store(type2) 80 assert.NoError(t, err) 81 err = newSession.SaveChanges() 82 assert.NoError(t, err) 83 84 newSession.Close() 85 } 86 87 def1 := ravendb.NewIndexDefinition() 88 def1.Name = "TestIndex" 89 def1.Maps = []string{"from doc in docs.CustomTypes select new { doc.value }"} 90 91 op := ravendb.NewPutIndexesOperation(def1) 92 err = store.Maintenance().Send(op) 93 assert.NoError(t, err) 94 95 { 96 session := openSessionMust(t, store) 97 98 q := session.Advanced().QueryIndex("TestIndex").WaitForNonStaleResults(0) 99 var notUsed []*CustomType 100 err = q.GetResults(¬Used) 101 assert.NoError(t, err) 102 103 session.Close() 104 } 105 106 op2 := ravendb.NewPatchByQueryOperation("FROM INDEX 'TestIndex' WHERE value = 1 update { put('NewItem/3', {'copiedValue': this.value });}") 107 operation, err := store.Operations().SendAsync(op2, nil) 108 assert.NoError(t, err) 109 110 err = operation.WaitForCompletion() 111 assert.NoError(t, err) 112 113 { 114 session := openSessionMust(t, store) 115 116 var jsonDoc *map[string]interface{} 117 err = session.Load(&jsonDoc, "NewItem/3") 118 assert.NoError(t, err) 119 m := *jsonDoc 120 assert.Equal(t, m["copiedValue"], float64(1)) 121 122 session.Close() 123 } 124 } 125 126 const SAMPLE_SCRIPT = `this.comments.splice(2, 1); 127 this.owner = 'Something new'; 128 this.value++; 129 this.newValue = "err!!"; 130 this.comments = this.comments.map(function(comment) { 131 return (comment == "one") ? comment + " test" : comment; 132 });` 133 134 func advancedPatchingCanApplyBasicScriptAsPatch(t *testing.T, driver *RavenTestDriver) { 135 var err error 136 store := driver.getDocumentStoreMust(t) 137 defer store.Close() 138 139 { 140 session := openSessionMust(t, store) 141 142 test := &CustomType{ 143 ID: "someId", 144 Owner: "bob", 145 Value: 12143, 146 Comments: []string{"one", "two", "seven"}, 147 } 148 149 err = session.Store(test) 150 assert.NoError(t, err) 151 err = session.SaveChanges() 152 assert.NoError(t, err) 153 154 session.Close() 155 } 156 req := &ravendb.PatchRequest{ 157 Script: SAMPLE_SCRIPT, 158 } 159 160 op, err := ravendb.NewPatchOperation("someId", nil, req, nil, false) 161 assert.NoError(t, err) 162 err = store.Operations().Send(op, nil) 163 assert.NoError(t, err) 164 165 { 166 session := openSessionMust(t, store) 167 168 var result *CustomType 169 err = session.Load(&result, "someId") 170 171 assert.Equal(t, result.Owner, "Something new") 172 assert.Equal(t, len(result.Comments), 2) 173 assert.Equal(t, result.Comments[0], "one test") 174 assert.Equal(t, result.Comments[1], "two") 175 assert.Equal(t, result.Value, 12144) 176 177 session.Close() 178 } 179 } 180 181 func advancedPatchingCanDeserializeModifiedDocument(t *testing.T, driver *RavenTestDriver) { 182 var err error 183 store := driver.getDocumentStoreMust(t) 184 defer store.Close() 185 186 customType := &CustomType{ 187 Owner: "somebody@somewhere.com", 188 } 189 { 190 session := openSessionMust(t, store) 191 192 err = session.StoreWithID(customType, "doc") 193 assert.NoError(t, err) 194 err = session.SaveChanges() 195 assert.NoError(t, err) 196 197 session.Close() 198 } 199 200 req := &ravendb.PatchRequest{ 201 Script: "this.owner = '123';", 202 } 203 patch1, err := ravendb.NewPatchOperation("doc", nil, req, nil, false) 204 assert.NoError(t, err) 205 patchResult, err := store.Operations().SendPatchOperation(patch1, nil) 206 assert.NoError(t, err) 207 var result *CustomType 208 err = patchResult.GetResult(&result) 209 assert.NoError(t, err) 210 211 assert.Equal(t, patchResult.Status, ravendb.PatchStatusPatched) 212 assert.Equal(t, result.Owner, "123") 213 214 patch2, err := ravendb.NewPatchOperation("doc", nil, req, nil, false) 215 assert.NoError(t, err) 216 patchResult, err = store.Operations().SendPatchOperation(patch2, nil) 217 assert.NoError(t, err) 218 result = nil 219 err = patchResult.GetResult(&result) 220 assert.NoError(t, err) 221 222 assert.Equal(t, patchResult.Status, ravendb.PatchStatusNotModified) 223 assert.Equal(t, result.Owner, "123") 224 } 225 226 func TestAdvancedPatching(t *testing.T) { 227 driver := createTestDriver(t) 228 destroy := func() { destroyDriver(t, driver) } 229 defer recoverTest(t, destroy) 230 231 // matches order of Java tests 232 advancedPatchingTestWithVariables(t, driver) 233 advancedPatchingCanCreateDocumentsIfPatchingAppliedByIndex(t, driver) 234 235 // TODO: order doesn't match Java 236 advancedPatchingCanApplyBasicScriptAsPatch(t, driver) 237 advancedPatchingCanDeserializeModifiedDocument(t, driver) 238 }