github.com/weaviate/weaviate@v1.24.6/test/acceptance/multi_tenancy/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/weaviate/weaviate/client/objects"
    18  
    19  	"github.com/stretchr/testify/assert"
    20  	"github.com/stretchr/testify/require"
    21  	"github.com/weaviate/weaviate/entities/models"
    22  	"github.com/weaviate/weaviate/entities/schema"
    23  	"github.com/weaviate/weaviate/test/helper"
    24  )
    25  
    26  func TestAddTenantObjects(t *testing.T) {
    27  	className := "MultiTenantClass"
    28  	testClass := models.Class{
    29  		Class: className,
    30  		MultiTenancyConfig: &models.MultiTenancyConfig{
    31  			Enabled: true,
    32  		},
    33  		Properties: []*models.Property{
    34  			{
    35  				Name:     "name",
    36  				DataType: schema.DataTypeText.PropString(),
    37  			},
    38  		},
    39  	}
    40  	tenantNames := []string{
    41  		"Tenant1", "Tenant2", "Tenant3",
    42  	}
    43  	tenantObjects := []*models.Object{
    44  		{
    45  			ID:    "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
    46  			Class: className,
    47  			Properties: map[string]interface{}{
    48  				"name": tenantNames[0],
    49  			},
    50  			Tenant: tenantNames[0],
    51  		},
    52  		{
    53  			ID:    "831ae1d0-f441-44b1-bb2a-46548048e26f",
    54  			Class: className,
    55  			Properties: map[string]interface{}{
    56  				"name": tenantNames[1],
    57  			},
    58  			Tenant: tenantNames[1],
    59  		},
    60  		{
    61  			ID:    "6f3363e0-c0a0-4618-bf1f-b6cad9cdff59",
    62  			Class: className,
    63  			Properties: map[string]interface{}{
    64  				"name": tenantNames[2],
    65  			},
    66  			Tenant: tenantNames[2],
    67  		},
    68  	}
    69  
    70  	defer func() {
    71  		helper.DeleteClass(t, className)
    72  	}()
    73  
    74  	t.Run("create class with multi-tenancy enabled", func(t *testing.T) {
    75  		helper.CreateClass(t, &testClass)
    76  	})
    77  
    78  	t.Run("create tenants", func(t *testing.T) {
    79  		tenants := make([]*models.Tenant, len(tenantNames))
    80  		for i := range tenants {
    81  			tenants[i] = &models.Tenant{Name: tenantNames[i]}
    82  		}
    83  		helper.CreateTenants(t, className, tenants)
    84  	})
    85  
    86  	t.Run("add tenant objects", func(t *testing.T) {
    87  		for _, obj := range tenantObjects {
    88  			helper.CreateObject(t, obj)
    89  		}
    90  	})
    91  
    92  	t.Run("verify object creation", func(t *testing.T) {
    93  		for i, obj := range tenantObjects {
    94  			resp, err := helper.TenantObject(t, obj.Class, obj.ID, tenantNames[i])
    95  			require.Nil(t, err)
    96  			assert.Equal(t, obj.Class, resp.Class)
    97  			assert.Equal(t, obj.Properties, resp.Properties)
    98  		}
    99  	})
   100  }
   101  
   102  func TestAddTenantObjectsToNonMultiClass(t *testing.T) {
   103  	className := "NoTenantClass"
   104  	tenantName := "randomTenant"
   105  	defer func() {
   106  		helper.DeleteClass(t, className)
   107  	}()
   108  
   109  	testClass := models.Class{
   110  		Class:              className,
   111  		MultiTenancyConfig: &models.MultiTenancyConfig{Enabled: false},
   112  	}
   113  	helper.CreateClass(t, &testClass)
   114  
   115  	objWithTenant := &models.Object{
   116  		ID:     "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   117  		Class:  className,
   118  		Tenant: tenantName,
   119  	}
   120  	params := objects.NewObjectsCreateParams().WithBody(objWithTenant)
   121  	_, err := helper.Client(t).Objects.ObjectsCreate(params, nil)
   122  	require.NotNil(t, err)
   123  }
   124  
   125  func TestAddNonTenantObjectsToMultiClass(t *testing.T) {
   126  	className := "TenantClassFail"
   127  	defer func() {
   128  		helper.DeleteClass(t, className)
   129  	}()
   130  
   131  	testClass := models.Class{
   132  		Class:              className,
   133  		MultiTenancyConfig: &models.MultiTenancyConfig{Enabled: true},
   134  	}
   135  	helper.CreateClass(t, &testClass)
   136  	objWithTenant := &models.Object{
   137  		ID:    "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   138  		Class: className,
   139  	}
   140  	params := objects.NewObjectsCreateParams().WithBody(objWithTenant)
   141  	_, err := helper.Client(t).Objects.ObjectsCreate(params, nil)
   142  	require.NotNil(t, err)
   143  }
   144  
   145  func TestAddObjectWithNonexistentTenantToMultiClass(t *testing.T) {
   146  	className := "TenantClass"
   147  	defer func() {
   148  		helper.DeleteClass(t, className)
   149  	}()
   150  
   151  	testClass := models.Class{
   152  		Class:              className,
   153  		MultiTenancyConfig: &models.MultiTenancyConfig{Enabled: true},
   154  	}
   155  	helper.CreateClass(t, &testClass)
   156  	helper.CreateTenants(t, className, []*models.Tenant{{Name: "randomTenant1"}})
   157  
   158  	objWithTenant := &models.Object{
   159  		ID:     "0927a1e0-398e-4e76-91fb-04a7a8f0405c",
   160  		Class:  className,
   161  		Tenant: "randomTenant2",
   162  	}
   163  	params := objects.NewObjectsCreateParams().WithBody(objWithTenant)
   164  	_, err := helper.Client(t).Objects.ObjectsCreate(params, nil)
   165  	require.NotNil(t, err)
   166  }