github.com/weaviate/weaviate@v1.24.6/test/acceptance/multi_tenancy/batch_add_tenant_objects_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package test
    13  
    14  import (
    15  	"testing"
    16  
    17  	"github.com/go-openapi/strfmt"
    18  	"github.com/google/uuid"
    19  
    20  	"github.com/weaviate/weaviate/client/batch"
    21  
    22  	"github.com/stretchr/testify/assert"
    23  	"github.com/stretchr/testify/require"
    24  	"github.com/weaviate/weaviate/entities/models"
    25  	"github.com/weaviate/weaviate/entities/schema"
    26  	"github.com/weaviate/weaviate/test/helper"
    27  )
    28  
    29  func TestBatchAddTenantObjects(t *testing.T) {
    30  	testClass := models.Class{
    31  		Class: "MultiTenantClass",
    32  		MultiTenancyConfig: &models.MultiTenancyConfig{
    33  			Enabled: true,
    34  		},
    35  		Properties: []*models.Property{
    36  			{
    37  				Name:     "name",
    38  				DataType: schema.DataTypeText.PropString(),
    39  			},
    40  		},
    41  	}
    42  	tenantName := "Tenant1"
    43  	tenantObjects := []*models.Object{
    44  		{
    45  			ID:    "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
    46  			Class: testClass.Class,
    47  			Properties: map[string]interface{}{
    48  				"name": tenantName,
    49  			},
    50  			Tenant: tenantName,
    51  		},
    52  		{
    53  			ID:    "831ae1d0-f441-44b1-bb2a-46548048e26f",
    54  			Class: testClass.Class,
    55  			Properties: map[string]interface{}{
    56  				"name": tenantName,
    57  			},
    58  			Tenant: tenantName,
    59  		},
    60  		{
    61  			ID:    "6f3363e0-c0a0-4618-bf1f-b6cad9cdff59",
    62  			Class: testClass.Class,
    63  			Properties: map[string]interface{}{
    64  				"name": tenantName,
    65  			},
    66  			Tenant: tenantName,
    67  		},
    68  	}
    69  
    70  	helper.CreateClass(t, &testClass)
    71  	defer func() {
    72  		helper.DeleteClass(t, testClass.Class)
    73  	}()
    74  
    75  	helper.CreateTenants(t, testClass.Class, []*models.Tenant{{Name: tenantName}})
    76  
    77  	t.Run("add and get tenant objects", func(t *testing.T) {
    78  		helper.CreateObjectsBatch(t, tenantObjects)
    79  
    80  		for _, obj := range tenantObjects {
    81  			resp, err := helper.TenantObject(t, obj.Class, obj.ID, tenantName)
    82  			require.Nil(t, err)
    83  			assert.Equal(t, obj.ID, resp.ID)
    84  			assert.Equal(t, obj.Class, resp.Class)
    85  			assert.Equal(t, obj.Tenant, resp.Tenant)
    86  		}
    87  	})
    88  }
    89  
    90  func TestBatchWithMixedTenants(t *testing.T) {
    91  	className := "MultiTenantClassMixedBatchFail"
    92  	classes := []models.Class{
    93  		{
    94  			Class: className + "1",
    95  			MultiTenancyConfig: &models.MultiTenancyConfig{
    96  				Enabled: true,
    97  			},
    98  		}, {
    99  			Class: className + "2",
   100  			MultiTenancyConfig: &models.MultiTenancyConfig{
   101  				Enabled: true,
   102  			},
   103  		},
   104  	}
   105  	tenants := []string{"tenant1", "tenant2", "tenant3"}
   106  	for i := range classes {
   107  		helper.CreateClass(t, &classes[i])
   108  		for k := range tenants {
   109  			helper.CreateTenants(t, classes[i].Class, []*models.Tenant{{Name: tenants[k]}})
   110  		}
   111  	}
   112  	defer func() {
   113  		for i := range classes {
   114  			helper.DeleteClass(t, classes[i].Class)
   115  		}
   116  	}()
   117  
   118  	var tenantObjects []*models.Object
   119  
   120  	for i := 0; i < 9; i++ {
   121  		tenantObjects = append(tenantObjects, &models.Object{
   122  			ID:     strfmt.UUID(uuid.New().String()),
   123  			Class:  classes[i%2].Class,
   124  			Tenant: tenants[i%len(tenants)],
   125  		},
   126  		)
   127  	}
   128  	helper.CreateObjectsBatch(t, tenantObjects)
   129  
   130  	for _, obj := range tenantObjects {
   131  		resp, err := helper.TenantObject(t, obj.Class, obj.ID, obj.Tenant)
   132  		require.Nil(t, err)
   133  		assert.Equal(t, obj.ID, resp.ID)
   134  		assert.Equal(t, obj.Class, resp.Class)
   135  	}
   136  }
   137  
   138  func TestAddNonTenantBatchToMultiClass(t *testing.T) {
   139  	className := "MultiTenantClassBatchFail"
   140  	testClass := models.Class{
   141  		Class: className,
   142  		MultiTenancyConfig: &models.MultiTenancyConfig{
   143  			Enabled: true,
   144  		},
   145  	}
   146  	nonTenantObjects := []*models.Object{
   147  		{
   148  			ID:    "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   149  			Class: testClass.Class,
   150  		},
   151  		{
   152  			ID:    "831ae1d0-f441-44b1-bb2a-46548048e26f",
   153  			Class: testClass.Class,
   154  		},
   155  		{
   156  			ID:    "6f3363e0-c0a0-4618-bf1f-b6cad9cdff59",
   157  			Class: testClass.Class,
   158  		},
   159  	}
   160  
   161  	helper.CreateClass(t, &testClass)
   162  	defer func() {
   163  		helper.DeleteClass(t, testClass.Class)
   164  	}()
   165  	helper.CreateTenants(t, className, []*models.Tenant{{Name: "randomTenant1"}})
   166  	params := batch.NewBatchObjectsCreateParams().
   167  		WithBody(batch.BatchObjectsCreateBody{
   168  			Objects: nonTenantObjects,
   169  		})
   170  	resp, err := helper.Client(t).Batch.BatchObjectsCreate(params, nil)
   171  	require.Nil(t, err)
   172  	for i := range resp.Payload {
   173  		require.NotNil(t, resp.Payload[i].Result.Errors)
   174  	}
   175  }
   176  
   177  func TestAddBatchToNonMultiClass(t *testing.T) {
   178  	className := "MultiTenantClassBatchFail"
   179  	testClass := models.Class{
   180  		Class: className,
   181  		MultiTenancyConfig: &models.MultiTenancyConfig{
   182  			Enabled: false,
   183  		},
   184  	}
   185  	tenantObjects := []*models.Object{
   186  		{
   187  			ID:     "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   188  			Class:  testClass.Class,
   189  			Tenant: "something",
   190  		},
   191  		{
   192  			ID:     "831ae1d0-f441-44b1-bb2a-46548048e26f",
   193  			Class:  testClass.Class,
   194  			Tenant: "something",
   195  		},
   196  		{
   197  			ID:     "6f3363e0-c0a0-4618-bf1f-b6cad9cdff59",
   198  			Class:  testClass.Class,
   199  			Tenant: "something",
   200  		},
   201  	}
   202  
   203  	helper.CreateClass(t, &testClass)
   204  	defer func() {
   205  		helper.DeleteClass(t, testClass.Class)
   206  	}()
   207  	params := batch.NewBatchObjectsCreateParams().
   208  		WithBody(batch.BatchObjectsCreateBody{
   209  			Objects: tenantObjects,
   210  		})
   211  	resp, err := helper.Client(t).Batch.BatchObjectsCreate(params, nil)
   212  	require.Nil(t, err)
   213  	for i := range resp.Payload {
   214  		require.NotNil(t, resp.Payload[i].Result.Errors)
   215  	}
   216  }
   217  
   218  func TestAddBatchWithNonExistentTenant(t *testing.T) {
   219  	className := "MultiTenantClassBatchFail"
   220  	testClass := models.Class{
   221  		Class: className,
   222  		MultiTenancyConfig: &models.MultiTenancyConfig{
   223  			Enabled: true,
   224  		},
   225  	}
   226  	nonTenantObjects := []*models.Object{
   227  		{
   228  			ID:     "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   229  			Class:  testClass.Class,
   230  			Tenant: "something",
   231  		},
   232  		{
   233  			ID:     "831ae1d0-f441-44b1-bb2a-46548048e26f",
   234  			Class:  testClass.Class,
   235  			Tenant: "something",
   236  		},
   237  		{
   238  			ID:     "6f3363e0-c0a0-4618-bf1f-b6cad9cdff59",
   239  			Class:  testClass.Class,
   240  			Tenant: "something",
   241  		},
   242  	}
   243  
   244  	helper.CreateClass(t, &testClass)
   245  	defer func() {
   246  		helper.DeleteClass(t, testClass.Class)
   247  	}()
   248  	helper.CreateTenants(t, className, []*models.Tenant{{Name: "somethingElse"}})
   249  
   250  	params := batch.NewBatchObjectsCreateParams().
   251  		WithBody(batch.BatchObjectsCreateBody{
   252  			Objects: nonTenantObjects,
   253  		})
   254  	resp, err := helper.Client(t).Batch.BatchObjectsCreate(params, nil)
   255  	require.Nil(t, err)
   256  	for i := range resp.Payload {
   257  		require.NotNil(t, resp.Payload[i].Result.Errors)
   258  	}
   259  }