github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/attachments_session_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"runtime"
     7  	"sort"
     8  	"strconv"
     9  	"testing"
    10  
    11  	"github.com/altipla-consulting/ravendb-go-client"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func attachmentsSessionPutAttachments(t *testing.T, driver *RavenTestDriver) {
    16  	var err error
    17  	store := driver.getDocumentStoreMust(t)
    18  	defer store.Close()
    19  	names := []string{"profile.png", "background-photo.jpg", "fileNAME_#$1^%_בעברית.txt"}
    20  
    21  	{
    22  		session := openSessionMust(t, store)
    23  		profileStream := bytes.NewBuffer([]byte{1, 2, 3})
    24  		backgroundStream := bytes.NewBuffer([]byte{10, 20, 30, 40, 50})
    25  		fileStream := bytes.NewBuffer([]byte{1, 2, 3, 4, 5})
    26  
    27  		user := &User{}
    28  		user.setName("Fitzchak")
    29  
    30  		err = session.StoreWithID(user, "users/1")
    31  		assert.NoError(t, err)
    32  
    33  		err = session.Advanced().Attachments().StoreByID("users/1", names[0], profileStream, "image/png")
    34  		assert.NoError(t, err)
    35  		err = session.Advanced().Attachments().Store(user, names[1], backgroundStream, "ImGgE/jPeG")
    36  		assert.NoError(t, err)
    37  		err = session.Advanced().Attachments().Store(user, names[2], fileStream, "")
    38  		assert.NoError(t, err)
    39  
    40  		err = session.SaveChanges()
    41  		assert.NoError(t, err)
    42  
    43  		session.Close()
    44  	}
    45  
    46  	{
    47  		session := openSessionMust(t, store)
    48  
    49  		var user *User
    50  		err = session.Load(&user, "users/1")
    51  		assert.NoError(t, err)
    52  		metadata, err := session.Advanced().GetMetadataFor(user)
    53  		assert.NoError(t, err)
    54  		v, ok := metadata.Get(ravendb.MetadataFlags)
    55  		assert.True(t, ok)
    56  		vStr := v.(string)
    57  		assert.Equal(t, vStr, "HasAttachments")
    58  
    59  		attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments)
    60  		assert.True(t, ok)
    61  		attachments := attachmentsI.([]interface{})
    62  		assert.Equal(t, len(attachments), 3)
    63  
    64  		sort.Strings(names)
    65  		var gotNames []string
    66  		for _, v := range attachments {
    67  
    68  			//TODO: dig deeper into what type metadata.Get() returns. It used to be
    69  			// *ravendb.MetadataDictionary and is now map[string]interface{}
    70  			//attachment := v.(*ravendb.MetadataDictionary)
    71  			//name, ok := attachment.Get("Name")
    72  
    73  			attachment := v.(map[string]interface{})
    74  			name, ok := attachment["Name"]
    75  
    76  			assert.True(t, ok)
    77  			gotNames = append(gotNames, name.(string))
    78  		}
    79  		sort.Strings(gotNames)
    80  		assert.Equal(t, names, gotNames)
    81  		session.Close()
    82  	}
    83  }
    84  
    85  func attachmentsSessionThrowIfStreamIsUseTwice(t *testing.T, driver *RavenTestDriver) {
    86  	var err error
    87  	store := driver.getDocumentStoreMust(t)
    88  	defer store.Close()
    89  
    90  	{
    91  		session := openSessionMust(t, store)
    92  
    93  		stream := bytes.NewBuffer([]byte{1, 2, 3})
    94  
    95  		user := &User{}
    96  		user.setName("Fitzchak")
    97  		err = session.StoreWithID(user, "users/1")
    98  		assert.NoError(t, err)
    99  
   100  		err = session.Advanced().Attachments().Store(user, "profile", stream, "image/png")
   101  		assert.NoError(t, err)
   102  		err = session.Advanced().Attachments().Store(user, "other", stream, "")
   103  		assert.NoError(t, err)
   104  
   105  		err = session.SaveChanges()
   106  		assert.Error(t, err)
   107  		_, ok := err.(*ravendb.IllegalStateError)
   108  		assert.True(t, ok)
   109  
   110  		session.Close()
   111  	}
   112  }
   113  
   114  func attachmentsSessionThrowWhenTwoAttachmentsWithTheSameNameInSession(t *testing.T, driver *RavenTestDriver) {
   115  	var err error
   116  	store := driver.getDocumentStoreMust(t)
   117  	defer store.Close()
   118  
   119  	{
   120  		session := openSessionMust(t, store)
   121  
   122  		stream := bytes.NewBuffer([]byte{1, 2, 3})
   123  		stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5})
   124  
   125  		user := &User{}
   126  		user.setName("Fitzchak")
   127  		err = session.StoreWithID(user, "users/1")
   128  		assert.NoError(t, err)
   129  
   130  		err = session.Advanced().Attachments().Store(user, "profile", stream, "image/png")
   131  		assert.NoError(t, err)
   132  
   133  		err = session.Advanced().Attachments().Store(user, "profile", stream2, "")
   134  		assert.Error(t, err)
   135  		_, ok := err.(*ravendb.IllegalStateError)
   136  		assert.True(t, ok)
   137  
   138  		session.Close()
   139  	}
   140  }
   141  
   142  func attachmentsSessionPutDocumentAndAttachmentAndDeleteShouldThrow(t *testing.T, driver *RavenTestDriver) {
   143  	var err error
   144  	store := driver.getDocumentStoreMust(t)
   145  	defer store.Close()
   146  
   147  	{
   148  		session := openSessionMust(t, store)
   149  		profileStream := bytes.NewBuffer([]byte{1, 2, 3})
   150  		user := &User{}
   151  		user.setName("Fitzchak")
   152  		err = session.StoreWithID(user, "users/1")
   153  		assert.NoError(t, err)
   154  
   155  		err = session.Advanced().Attachments().Store(user, "profile.png", profileStream, "image/png")
   156  		assert.NoError(t, err)
   157  
   158  		err = session.Delete(user)
   159  		assert.NoError(t, err)
   160  
   161  		err = session.SaveChanges()
   162  		assert.Error(t, err)
   163  		_, ok := err.(*ravendb.IllegalStateError)
   164  		assert.True(t, ok)
   165  
   166  		session.Close()
   167  	}
   168  }
   169  
   170  func attachmentsSessionDeleteAttachments(t *testing.T, driver *RavenTestDriver) {
   171  	var err error
   172  	store := driver.getDocumentStoreMust(t)
   173  	defer store.Close()
   174  
   175  	{
   176  		session := openSessionMust(t, store)
   177  
   178  		user := &User{}
   179  		user.setName("Fitzchak")
   180  		err = session.StoreWithID(user, "users/1")
   181  		assert.NoError(t, err)
   182  
   183  		stream1 := bytes.NewBuffer([]byte{1, 2, 3})
   184  		stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6})
   185  		stream3 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9})
   186  		stream4 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12})
   187  
   188  		err = session.Advanced().Attachments().Store(user, "file1", stream1, "image/png")
   189  		assert.NoError(t, err)
   190  		err = session.Advanced().Attachments().Store(user, "file2", stream2, "image/png")
   191  		assert.NoError(t, err)
   192  		err = session.Advanced().Attachments().Store(user, "file3", stream3, "image/png")
   193  		assert.NoError(t, err)
   194  		err = session.Advanced().Attachments().Store(user, "file4", stream4, "image/png")
   195  		assert.NoError(t, err)
   196  
   197  		err = session.SaveChanges()
   198  		assert.NoError(t, err)
   199  
   200  		session.Close()
   201  	}
   202  
   203  	{
   204  		session := openSessionMust(t, store)
   205  
   206  		var user *User
   207  		err = session.Load(&user, "users/1")
   208  		assert.NoError(t, err)
   209  
   210  		// test get attachment by its name
   211  		{
   212  			var attachmentResult *ravendb.AttachmentResult
   213  			attachmentResult, err = session.Advanced().Attachments().GetByID("users/1", "file2")
   214  			assert.NoError(t, err)
   215  			name := attachmentResult.Details.Name
   216  			assert.Equal(t, name, "file2")
   217  			attachmentResult.Close()
   218  		}
   219  
   220  		err = session.Advanced().Attachments().DeleteByID("users/1", "file2")
   221  		assert.NoError(t, err)
   222  		err = session.Advanced().Attachments().Delete(user, "file4")
   223  		assert.NoError(t, err)
   224  		err = session.SaveChanges()
   225  		assert.NoError(t, err)
   226  
   227  		session.Close()
   228  	}
   229  
   230  	{
   231  		session := openSessionMust(t, store)
   232  
   233  		var user *User
   234  		err = session.Load(&user, "users/1")
   235  		assert.NoError(t, err)
   236  
   237  		metadata, err := session.Advanced().GetMetadataFor(user)
   238  		assert.NoError(t, err)
   239  
   240  		v, ok := metadata.Get(ravendb.MetadataFlags)
   241  		assert.True(t, ok)
   242  		assert.Equal(t, v, "HasAttachments")
   243  
   244  		attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments)
   245  		assert.True(t, ok)
   246  		attachments := attachmentsI.([]interface{})
   247  
   248  		assert.Equal(t, len(attachments), 2)
   249  
   250  		{
   251  			result, err := session.Advanced().Attachments().GetByID("users/1", "file1")
   252  			assert.NoError(t, err)
   253  			r := result.Data
   254  			file1Bytes, err := ioutil.ReadAll(r)
   255  			assert.NoError(t, err)
   256  
   257  			assert.Equal(t, len(file1Bytes), 3)
   258  
   259  			result.Close()
   260  		}
   261  		session.Close()
   262  	}
   263  }
   264  
   265  func attachmentsSessionDeleteAttachmentsUsingCommand(t *testing.T, driver *RavenTestDriver) {
   266  	var err error
   267  	store := driver.getDocumentStoreMust(t)
   268  	defer store.Close()
   269  
   270  	{
   271  		session := openSessionMust(t, store)
   272  
   273  		user := &User{}
   274  		user.setName("Fitzchak")
   275  		err = session.StoreWithID(user, "users/1")
   276  		assert.NoError(t, err)
   277  
   278  		stream1 := bytes.NewBuffer([]byte{1, 2, 3})
   279  		stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6})
   280  
   281  		err = session.Advanced().Attachments().Store(user, "file1", stream1, "image/png")
   282  		assert.NoError(t, err)
   283  		err = session.Advanced().Attachments().Store(user, "file2", stream2, "image/png")
   284  		assert.NoError(t, err)
   285  
   286  		err = session.SaveChanges()
   287  		assert.NoError(t, err)
   288  
   289  		session.Close()
   290  	}
   291  
   292  	op := ravendb.NewDeleteAttachmentOperation("users/1", "file2", nil)
   293  	err = store.Operations().Send(op, nil)
   294  	assert.NoError(t, err)
   295  
   296  	{
   297  		session := openSessionMust(t, store)
   298  
   299  		var user *User
   300  		err = session.Load(&user, "users/1")
   301  		assert.NoError(t, err)
   302  
   303  		metadata, err := session.Advanced().GetMetadataFor(user)
   304  		assert.NoError(t, err)
   305  
   306  		v, ok := metadata.Get(ravendb.MetadataFlags)
   307  		assert.True(t, ok)
   308  		assert.Equal(t, v, "HasAttachments")
   309  
   310  		attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments)
   311  		assert.True(t, ok)
   312  		attachments := attachmentsI.([]interface{})
   313  		assert.Equal(t, len(attachments), 1)
   314  
   315  		{
   316  			result, err := session.Advanced().Attachments().GetByID("users/1", "file1")
   317  			assert.NoError(t, err)
   318  			r := result.Data
   319  			file1Bytes, err := ioutil.ReadAll(r)
   320  			assert.NoError(t, err)
   321  			assert.Equal(t, len(file1Bytes), 3)
   322  
   323  			result.Close()
   324  		}
   325  
   326  		session.Close()
   327  	}
   328  }
   329  
   330  func attachmentsSessionGetAttachmentReleasesResources(t *testing.T, driver *RavenTestDriver) {
   331  	count := 30
   332  	var err error
   333  	store := driver.getDocumentStoreMust(t)
   334  	defer store.Close()
   335  
   336  	{
   337  		session := openSessionMust(t, store)
   338  
   339  		user := &User{}
   340  		err = session.StoreWithID(user, "users/1")
   341  		assert.NoError(t, err)
   342  		err = session.SaveChanges()
   343  		assert.NoError(t, err)
   344  
   345  		session.Close()
   346  	}
   347  
   348  	for i := 0; i < count; i++ {
   349  		session := openSessionMust(t, store)
   350  
   351  		stream1 := bytes.NewBuffer([]byte{1, 2, 3})
   352  		err = session.Advanced().Attachments().StoreByID("users/1", "file"+strconv.Itoa(i), stream1, "image/png")
   353  		assert.NoError(t, err)
   354  		err = session.SaveChanges()
   355  		assert.NoError(t, err)
   356  
   357  		session.Close()
   358  	}
   359  
   360  	for i := 0; i < count; i++ {
   361  		session := openSessionMust(t, store)
   362  		result, err := session.Advanced().Attachments().GetByID("users/1", "file"+strconv.Itoa(i))
   363  		assert.NoError(t, err)
   364  		// don't read data as it marks entity as consumed
   365  		result.Close()
   366  		session.Close()
   367  	}
   368  }
   369  
   370  func attachmentsSessionDeleteDocumentAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t *testing.T, driver *RavenTestDriver) {
   371  	var err error
   372  	store := driver.getDocumentStoreMust(t)
   373  	defer store.Close()
   374  
   375  	{
   376  		session := openSessionMust(t, store)
   377  
   378  		user := &User{}
   379  		user.setName("Fitzchak")
   380  		err = session.StoreWithID(user, "users/1")
   381  		assert.NoError(t, err)
   382  
   383  		stream := bytes.NewBuffer([]byte{1, 2, 3})
   384  
   385  		err = session.Advanced().Attachments().Store(user, "file", stream, "image/png")
   386  		assert.NoError(t, err)
   387  
   388  		err = session.SaveChanges()
   389  		assert.NoError(t, err)
   390  
   391  		session.Close()
   392  	}
   393  
   394  	{
   395  		session := openSessionMust(t, store)
   396  
   397  		var user *User
   398  		err = session.Load(&user, "users/1")
   399  		assert.NoError(t, err)
   400  
   401  		err = session.Delete(user)
   402  		assert.NoError(t, err)
   403  		err = session.Advanced().Attachments().Delete(user, "file")
   404  		assert.NoError(t, err)
   405  		err = session.Advanced().Attachments().Delete(user, "file") // this should be no-op
   406  		assert.NoError(t, err)
   407  
   408  		err = session.SaveChanges()
   409  		assert.NoError(t, err)
   410  
   411  		session.Close()
   412  	}
   413  }
   414  
   415  func attachmentsSessionDeleteDocumentByCommandAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t *testing.T, driver *RavenTestDriver) {
   416  	var err error
   417  	store := driver.getDocumentStoreMust(t)
   418  	defer store.Close()
   419  
   420  	{
   421  		session := openSessionMust(t, store)
   422  		user := &User{}
   423  		user.setName("Fitzchak")
   424  		err = session.StoreWithID(user, "users/1")
   425  		assert.NoError(t, err)
   426  
   427  		stream := bytes.NewBuffer([]byte{1, 2, 3})
   428  
   429  		err = session.Advanced().Attachments().Store(user, "file", stream, "image/png")
   430  		assert.NoError(t, err)
   431  		err = session.SaveChanges()
   432  		assert.NoError(t, err)
   433  
   434  		session.Close()
   435  	}
   436  
   437  	{
   438  		session := openSessionMust(t, store)
   439  
   440  		cd := ravendb.NewDeleteCommandData("users/1", "")
   441  		session.Advanced().Defer(cd)
   442  		err = session.Advanced().Attachments().DeleteByID("users/1", "file")
   443  		assert.NoError(t, err)
   444  		err = session.Advanced().Attachments().DeleteByID("users/1", "file")
   445  		assert.NoError(t, err)
   446  
   447  		err = session.SaveChanges()
   448  		assert.NoError(t, err)
   449  
   450  		session.Close()
   451  	}
   452  }
   453  
   454  func attachmentsSessionGetAttachmentNames(t *testing.T, driver *RavenTestDriver) {
   455  	var err error
   456  	store := driver.getDocumentStoreMust(t)
   457  	defer store.Close()
   458  
   459  	names := []string{"profile.png"}
   460  
   461  	{
   462  		session := openSessionMust(t, store)
   463  
   464  		profileStream := bytes.NewBuffer([]byte{1, 2, 3})
   465  
   466  		user := &User{}
   467  		user.setName("Fitzchak")
   468  		err = session.StoreWithID(user, "users/1")
   469  		assert.NoError(t, err)
   470  
   471  		err = session.Advanced().Attachments().StoreByID("users/1", names[0], profileStream, "image/png")
   472  		assert.NoError(t, err)
   473  
   474  		err = session.SaveChanges()
   475  		assert.NoError(t, err)
   476  
   477  		session.Close()
   478  	}
   479  
   480  	{
   481  		session := openSessionMust(t, store)
   482  
   483  		var user *User
   484  		err = session.Load(&user, "users/1")
   485  		assert.NoError(t, err)
   486  
   487  		attachments, err := session.Advanced().Attachments().GetNames(user)
   488  		assert.NoError(t, err)
   489  
   490  		assert.Equal(t, len(attachments), 1)
   491  
   492  		attachment := attachments[0]
   493  		assert.Equal(t, attachment.ContentType, "image/png")
   494  		assert.Equal(t, attachment.Name, names[0])
   495  		assert.Equal(t, attachment.Size, int64(3))
   496  
   497  		session.Close()
   498  	}
   499  
   500  	// go: coverage for DocumentSessionAttachments.Get()
   501  	{
   502  		session := openSessionMust(t, store)
   503  
   504  		var user *User
   505  		err = session.Load(&user, "users/1")
   506  		assert.NoError(t, err)
   507  
   508  		attachment, err := session.Advanced().Attachments().Get(user, names[0])
   509  		assert.NoError(t, err)
   510  		assert.Equal(t, attachment.Details.Name, names[0])
   511  
   512  		session.Close()
   513  	}
   514  }
   515  
   516  func attachmentsSessionAttachmentExists(t *testing.T, driver *RavenTestDriver) {
   517  	var err error
   518  	store := driver.getDocumentStoreMust(t)
   519  	defer store.Close()
   520  
   521  	{
   522  		session := openSessionMust(t, store)
   523  
   524  		stream := bytes.NewBuffer([]byte{1, 2, 3})
   525  
   526  		user := &User{}
   527  		user.setName("Fitzchak")
   528  
   529  		err = session.StoreWithID(user, "users/1")
   530  		assert.NoError(t, err)
   531  
   532  		err = session.Advanced().Attachments().StoreByID("users/1", "profile", stream, "image/png")
   533  		assert.NoError(t, err)
   534  		err = session.SaveChanges()
   535  		assert.NoError(t, err)
   536  
   537  		session.Close()
   538  	}
   539  
   540  	{
   541  		session := openSessionMust(t, store)
   542  
   543  		ok, err := session.Advanced().Attachments().Exists("users/1", "profile")
   544  		assert.NoError(t, err)
   545  		assert.True(t, ok)
   546  
   547  		ok, err = session.Advanced().Attachments().Exists("users/1", "background-photo")
   548  		assert.NoError(t, err)
   549  		assert.False(t, ok)
   550  
   551  		ok, err = session.Advanced().Attachments().Exists("users/2", "profile")
   552  		assert.NoError(t, err)
   553  		assert.False(t, ok)
   554  
   555  		session.Close()
   556  	}
   557  }
   558  
   559  func TestAttachmentsSession(t *testing.T) {
   560  	driver := createTestDriver(t)
   561  	destroy := func() { destroyDriver(t, driver) }
   562  	defer recoverTest(t, destroy)
   563  
   564  	// Those are flaky on mac and mac only. I suspect server issue
   565  	// see https://github.com/altipla-consulting/ravendb-go-client/issues/92
   566  	if runtime.GOOS == "darwin" && !enableFlakyTests {
   567  		return
   568  	}
   569  
   570  	// matches order of Java tests
   571  	attachmentsSessionPutAttachments(t, driver)
   572  	attachmentsSessionPutDocumentAndAttachmentAndDeleteShouldThrow(t, driver)
   573  	attachmentsSessionGetAttachmentNames(t, driver)
   574  	attachmentsSessionDeleteDocumentByCommandAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t, driver)
   575  	attachmentsSessionDeleteAttachments(t, driver)
   576  	attachmentsSessionAttachmentExists(t, driver)
   577  	attachmentsSessionThrowWhenTwoAttachmentsWithTheSameNameInSession(t, driver)
   578  	attachmentsSessionDeleteDocumentAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t, driver)
   579  	attachmentsSessionThrowIfStreamIsUseTwice(t, driver)
   580  	attachmentsSessionGetAttachmentReleasesResources(t, driver)
   581  	attachmentsSessionDeleteAttachmentsUsingCommand(t, driver)
   582  }