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  }