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 }