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

     1  package tests
     2  
     3  import (
     4  	"math"
     5  	"sort"
     6  	"strconv"
     7  	"testing"
     8  
     9  	"github.com/ravendb/ravendb-go-client"
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func collectUserNamesSorted(a []*User) []string {
    14  	var names []string
    15  	for _, user := range a {
    16  		names = append(names, *user.Name)
    17  	}
    18  	sort.Strings(names)
    19  	return names
    20  }
    21  
    22  func createRevisions(t *testing.T, store *ravendb.DocumentStore) {
    23  	for i := 0; i < 4; i++ {
    24  		session := openSessionMust(t, store)
    25  		user := &User{}
    26  		user.setName("user" + strconv.Itoa(i+1))
    27  		err := session.StoreWithID(user, "users/1")
    28  		assert.NoError(t, err)
    29  		err = session.SaveChanges()
    30  		assert.NoError(t, err)
    31  		session.Close()
    32  	}
    33  }
    34  
    35  func revisionsTestRevisions(t *testing.T, driver *RavenTestDriver) {
    36  
    37  	var err error
    38  	store := driver.getDocumentStoreMust(t)
    39  	defer store.Close()
    40  
    41  	_, err = setupRevisions(store, false, 4)
    42  	assert.NoError(t, err)
    43  
    44  	createRevisions(t, store)
    45  
    46  	{
    47  		session := openSessionMust(t, store)
    48  
    49  		var allRevisions []*User
    50  		err = session.Advanced().Revisions().GetFor(&allRevisions, "users/1")
    51  		assert.NoError(t, err)
    52  		assert.Equal(t, len(allRevisions), 4)
    53  
    54  		names := collectUserNamesSorted(allRevisions)
    55  		assert.Equal(t, names, []string{"user1", "user2", "user3", "user4"})
    56  
    57  		var revisionsSkipFirst []*User
    58  		err = session.Advanced().Revisions().GetForStartAt(&revisionsSkipFirst, "users/1", 1)
    59  		assert.NoError(t, err)
    60  		assert.Equal(t, len(revisionsSkipFirst), 3)
    61  		names = collectUserNamesSorted(revisionsSkipFirst)
    62  		assert.Equal(t, names, []string{"user1", "user2", "user3"})
    63  
    64  		var revisionsSkipFirstTakeTwo []*User
    65  		err = session.Advanced().Revisions().GetForPaged(&revisionsSkipFirstTakeTwo, "users/1", 1, 2)
    66  		assert.NoError(t, err)
    67  		assert.Equal(t, len(revisionsSkipFirstTakeTwo), 2)
    68  		names = collectUserNamesSorted(revisionsSkipFirstTakeTwo)
    69  		assert.Equal(t, names, []string{"user2", "user3"})
    70  
    71  		allMetadata, err := session.Advanced().Revisions().GetMetadataFor("users/1")
    72  		assert.NoError(t, err)
    73  		assert.Equal(t, len(allMetadata), 4)
    74  
    75  		metadataSkipFirst, err := session.Advanced().Revisions().GetMetadataForStartAt("users/1", 1)
    76  		assert.NoError(t, err)
    77  		assert.Equal(t, len(metadataSkipFirst), 3)
    78  
    79  		metadataSkipFirstTakeTwo, err := session.Advanced().Revisions().GetMetadataForPaged("users/1", 1, 2)
    80  		assert.NoError(t, err)
    81  		assert.Equal(t, len(metadataSkipFirstTakeTwo), 2)
    82  
    83  		dict := metadataSkipFirst[0]
    84  		var changeVector string
    85  		chvi, ok := dict.Get(ravendb.MetadataChangeVector)
    86  		if ok {
    87  			changeVector = chvi.(string)
    88  		}
    89  		var user *User
    90  		err = session.Advanced().Revisions().Get(&user, changeVector)
    91  		assert.NoError(t, err)
    92  		assert.Equal(t, *user.Name, "user3")
    93  		session.Close()
    94  	}
    95  }
    96  
    97  func revisionsTestCanListRevisionsBin(t *testing.T, driver *RavenTestDriver) {
    98  
    99  	var err error
   100  	store := driver.getDocumentStoreMust(t)
   101  	defer store.Close()
   102  
   103  	_, err = setupRevisions(store, false, 4)
   104  	assert.NoError(t, err)
   105  
   106  	createRevisions(t, store)
   107  
   108  	{
   109  		session := openSessionMust(t, store)
   110  
   111  		user := &User{}
   112  		user.setName("user1")
   113  		err = session.StoreWithID(user, "users/1")
   114  		assert.NoError(t, err)
   115  		err = session.SaveChanges()
   116  		assert.NoError(t, err)
   117  
   118  		session.Close()
   119  	}
   120  
   121  	{
   122  		session := openSessionMust(t, store)
   123  
   124  		err = session.DeleteByID("users/1", "")
   125  		assert.NoError(t, err)
   126  		err = session.SaveChanges()
   127  		assert.NoError(t, err)
   128  
   129  		session.Close()
   130  	}
   131  	revisionsBinEntryCommand := ravendb.NewGetRevisionsBinEntryCommand(math.MaxInt64, 20)
   132  	err = store.GetRequestExecutor("").ExecuteCommand(revisionsBinEntryCommand, nil)
   133  	assert.NoError(t, err)
   134  	result := revisionsBinEntryCommand.Result
   135  	assert.Equal(t, len(result.Results), 1)
   136  	metaI := result.Results[0]["@metadata"]
   137  	meta := metaI.(map[string]interface{})
   138  	id, _ := jsonGetAsText(meta, "@id")
   139  	assert.Equal(t, id, "users/1")
   140  }
   141  
   142  // for better code coverage
   143  func goRevisionsTest(t *testing.T, driver *RavenTestDriver) {
   144  
   145  	var err error
   146  	store := driver.getDocumentStoreMust(t)
   147  	defer store.Close()
   148  
   149  	_, err = setupRevisions(store, false, 4)
   150  	assert.NoError(t, err)
   151  
   152  	createRevisions(t, store)
   153  
   154  	{
   155  		session := openSessionMust(t, store)
   156  
   157  		allMetadata, err := session.Advanced().Revisions().GetMetadataFor("users/1")
   158  		assert.NoError(t, err)
   159  		assert.Equal(t, len(allMetadata), 4)
   160  
   161  		var changeVectors []string
   162  		for _, dict := range allMetadata {
   163  			var changeVector string
   164  			chvi, ok := dict.Get(ravendb.MetadataChangeVector)
   165  			if ok {
   166  				changeVector = chvi.(string)
   167  				changeVectors = append(changeVectors, changeVector)
   168  			}
   169  		}
   170  		assert.Equal(t, len(changeVectors), 4)
   171  
   172  		revisions := map[string]*User{}
   173  		err = session.Advanced().Revisions().GetRevisions(revisions, changeVectors)
   174  		assert.NoError(t, err)
   175  		assert.Equal(t, len(revisions), 4)
   176  		session.Close()
   177  	}
   178  }
   179  
   180  func TestRevisions(t *testing.T) {
   181  	driver := createTestDriver(t)
   182  	destroy := func() { destroyDriver(t, driver) }
   183  	defer recoverTest(t, destroy)
   184  
   185  	revisionsTestRevisions(t, driver)
   186  	// TODO: order might be different than Java
   187  	revisionsTestCanListRevisionsBin(t, driver)
   188  
   189  	goRevisionsTest(t, driver)
   190  }