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

     1  package tests
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	ravendb "github.com/ravendb/ravendb-go-client"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  func deleteByQueryCanDeleteByQuery(t *testing.T, driver *RavenTestDriver) {
    15  	var err error
    16  	store := driver.getDocumentStoreMust(t)
    17  	defer store.Close()
    18  
    19  	{
    20  		session := openSessionMust(t, store)
    21  		user1 := &User{
    22  			Age: 5,
    23  		}
    24  		err = session.Store(user1)
    25  		assert.NoError(t, err)
    26  
    27  		user2 := &User{
    28  			Age: 10,
    29  		}
    30  		err = session.Store(user2)
    31  		assert.NoError(t, err)
    32  
    33  		err = session.SaveChanges()
    34  		assert.NoError(t, err)
    35  		session.Close()
    36  	}
    37  
    38  	{
    39  		indexQuery := ravendb.NewIndexQuery("from users where age == 5")
    40  		operation, err := ravendb.NewDeleteByQueryOperation(indexQuery, nil)
    41  		assert.NoError(t, err)
    42  		asyncOp, err := store.Operations().SendAsync(operation, nil)
    43  		assert.NoError(t, err)
    44  
    45  		err = asyncOp.WaitForCompletion()
    46  		assert.NoError(t, err)
    47  
    48  		{
    49  			session := openSessionMust(t, store)
    50  			q := session.QueryCollectionForType(reflect.TypeOf(&User{}))
    51  			count, err := q.Count()
    52  			assert.NoError(t, err)
    53  			assert.Equal(t, count, 1)
    54  			session.Close()
    55  		}
    56  	}
    57  }
    58  
    59  func deleteByQueryCanDeleteByQueryWaitUsingChanges(t *testing.T, driver *RavenTestDriver) {
    60  	var err error
    61  	store := driver.getDocumentStoreMust(t)
    62  	defer store.Close()
    63  
    64  	{
    65  		session := openSessionMust(t, store)
    66  		user1 := &User{
    67  			Age: 5,
    68  		}
    69  		err = session.Store(user1)
    70  		assert.NoError(t, err)
    71  
    72  		user2 := &User{
    73  			Age: 10,
    74  		}
    75  		err = session.Store(user2)
    76  		assert.NoError(t, err)
    77  
    78  		err = session.SaveChanges()
    79  		assert.NoError(t, err)
    80  		session.Close()
    81  	}
    82  
    83  	var cancel ravendb.CancelFunc
    84  
    85  	{
    86  		changesList := make(chan *ravendb.OperationStatusChange, 1)
    87  		changes := store.Changes("")
    88  		err = changes.EnsureConnectedNow()
    89  		require.NoError(t, err)
    90  
    91  		cb := func(change *ravendb.OperationStatusChange) {
    92  			changesList <- change
    93  		}
    94  		cancel, err = changes.ForAllOperations(cb)
    95  		require.NoError(t, err)
    96  
    97  		indexQuery := ravendb.NewIndexQuery("from users where age == 5")
    98  		operation, err := ravendb.NewDeleteByQueryOperation(indexQuery, nil)
    99  		assert.NoError(t, err)
   100  		_, err = store.Operations().SendAsync(operation, nil)
   101  		assert.NoError(t, err)
   102  
   103  		select {
   104  		case change := <-changesList:
   105  			// ok, got a change
   106  			expID := operation.Command.Result.OperationID
   107  			assert.Equal(t, change.OperationID, expID)
   108  		case <-time.After(15 * time.Second):
   109  			assert.Fail(t, "timed out waiting for operation change notification")
   110  		}
   111  
   112  		cancel()
   113  		changes.Close()
   114  	}
   115  }
   116  
   117  func TestDeleteByQuery(t *testing.T) {
   118  	driver := createTestDriver(t)
   119  	destroy := func() { destroyDriver(t, driver) }
   120  	defer recoverTest(t, destroy)
   121  
   122  	// matches order of Java tests
   123  	//TODO: match order of Java tests
   124  	deleteByQueryCanDeleteByQuery(t, driver)
   125  
   126  	deleteByQueryCanDeleteByQueryWaitUsingChanges(t, driver)
   127  }