Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package schema | |
import ( | |
"context" | |
"testing" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
"github.com/weaviate/weaviate/entities/models" | |
"github.com/weaviate/weaviate/usecases/sharding" | |
) | |
func TestForceDelete(t *testing.T) { | |
type test struct { | |
name string | |
existingSchema []*models.Class | |
classToDelete string | |
expErr bool | |
expErrMsg string | |
expSchema []*models.Class | |
} | |
tests := []test{ | |
{ | |
name: "class exists", | |
existingSchema: []*models.Class{ | |
{Class: "MyClass", VectorIndexType: "hnsw"}, | |
{Class: "OtherClass", VectorIndexType: "hnsw"}, | |
}, | |
classToDelete: "MyClass", | |
expSchema: []*models.Class{ | |
classWithDefaultsSet(t, "OtherClass"), | |
}, | |
expErr: false, | |
}, | |
{ | |
name: "class does not exist", | |
existingSchema: []*models.Class{ | |
{Class: "OtherClass", VectorIndexType: "hnsw"}, | |
}, | |
classToDelete: "MyClass", | |
expSchema: []*models.Class{ | |
classWithDefaultsSet(t, "OtherClass"), | |
}, | |
expErr: false, | |
}, | |
} | |
for _, test := range tests { | |
t.Run(test.name, func(t *testing.T) { | |
clusterState := &fakeClusterState{ | |
hosts: []string{"node1"}, | |
} | |
txClient := &fakeTxClient{} | |
initialSchema := &State{ | |
ObjectSchema: &models.Schema{ | |
Classes: test.existingSchema, | |
}, | |
} | |
sm, err := newManagerWithClusterAndTx(t, clusterState, txClient, initialSchema) | |
require.Nil(t, err) | |
err = sm.DeleteClass(context.Background(), nil, test.classToDelete) | |
if test.expErr { | |
require.NotNil(t, err) | |
assert.Contains(t, err.Error(), test.expErrMsg) | |
} else { | |
require.Nil(t, err) | |
} | |
assert.ElementsMatch(t, test.expSchema, sm.GetSchemaSkipAuth().Objects.Classes) | |
if len(sm.schemaCache.ShardingState) != len(test.expSchema) { | |
t.Errorf("sharding state entries != schema: %d vs %d", | |
len(sm.schemaCache.ShardingState), len(test.expSchema)) | |
} | |
}) | |
} | |
} | |
func classWithDefaultsSet(t *testing.T, name string) *models.Class { | |
class := &models.Class{Class: name, VectorIndexType: "hnsw"} | |
sc, err := sharding.ParseConfig(map[string]interface{}{}, 1) | |
require.Nil(t, err) | |
class.ShardingConfig = sc | |
class.VectorIndexConfig = fakeVectorConfig{} | |
class.ReplicationConfig = &models.ReplicationConfig{Factor: 1} | |
return class | |
} | |