github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/tests/advanced_patching_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	ravendb "github.com/ravendb/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(&notUsed)
   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  }