consul/internal/controller/cache/index/iterator_test.go

66 lines
1.7 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package index
import (
"testing"
"github.com/hashicorp/consul/internal/controller/cache/index/indexmock"
"github.com/hashicorp/consul/internal/resource"
"github.com/hashicorp/consul/internal/resource/resourcetest"
"github.com/hashicorp/consul/proto-public/pbresource"
"github.com/hashicorp/consul/proto/private/prototest"
"github.com/stretchr/testify/require"
)
var (
testResourceType = &pbresource.Type{
Group: "test",
GroupVersion: "v1",
Kind: "fake",
}
)
func testResource(name string) *pbresource.Resource {
return resourcetest.Resource(testResourceType, name).
WithTenancy(resource.DefaultNamespacedTenancy()).
Build()
}
func TestResourceIteratorNext(t *testing.T) {
m := indexmock.NewResourceIterable(t)
r1 := testResource("one")
r2 := testResource("two")
r3 := testResource("three")
m.EXPECT().Next().Once().Return(nil, []*pbresource.Resource{r1}, true)
m.EXPECT().Next().Once().Return(nil, []*pbresource.Resource{r2, r3}, false)
m.EXPECT().Next().Return(nil, nil, false)
i := resourceIterator{
iter: m,
}
// iterator is processing the first list of items
actual := i.Next()
require.NotNil(t, actual)
prototest.AssertDeepEqual(t, r1, actual)
// iterator should now be processing the second list of items.
actual = i.Next()
require.NotNil(t, actual)
prototest.AssertDeepEqual(t, r2, actual)
// second element of second list returned
actual = i.Next()
require.NotNil(t, actual)
prototest.AssertDeepEqual(t, r3, actual)
// no more items so a call to Next should return nil
actual = i.Next()
require.Nil(t, actual)
// verify that it continues to return nil indefinitely without causing a panic.
actual = i.Next()
require.Nil(t, actual)
}