consul/internal/resource/demo/controller_test.go

103 lines
3.1 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package demo
import (
"testing"
"github.com/stretchr/testify/require"
svctest "github.com/hashicorp/consul/agent/grpc-external/services/resource/testing"
"github.com/hashicorp/consul/internal/controller"
"github.com/hashicorp/consul/proto-public/pbresource"
pbdemov2 "github.com/hashicorp/consul/proto/private/pbdemo/v2"
"github.com/hashicorp/consul/sdk/testutil"
)
func TestArtistReconciler(t *testing.T) {
client := svctest.RunResourceService(t, RegisterTypes)
// Seed the database with an artist.
res, err := GenerateV2Artist()
require.NoError(t, err)
// Set the genre to BLUES to ensure there are 10 albums.
var artist pbdemov2.Artist
require.NoError(t, res.Data.UnmarshalTo(&artist))
artist.Genre = pbdemov2.Genre_GENRE_BLUES
require.NoError(t, res.Data.MarshalFrom(&artist))
ctx := testutil.TestContext(t)
writeRsp, err := client.Write(ctx, &pbresource.WriteRequest{Resource: res})
require.NoError(t, err)
// Call the reconciler for that artist.
var rec artistReconciler
runtime := controller.Runtime{
Client: client,
Logger: testutil.Logger(t),
}
req := controller.Request{
ID: writeRsp.Resource.Id,
}
require.NoError(t, rec.Reconcile(ctx, runtime, req))
// Check the status was updated.
readRsp, err := client.Read(ctx, &pbresource.ReadRequest{Id: writeRsp.Resource.Id})
require.NoError(t, err)
require.Contains(t, readRsp.Resource.Status, "consul.io/artist-controller")
status := readRsp.Resource.Status["consul.io/artist-controller"]
require.Equal(t, writeRsp.Resource.Generation, status.ObservedGeneration)
require.Len(t, status.Conditions, 11)
require.Equal(t, "Accepted", status.Conditions[0].Type)
require.Equal(t, "AlbumCreated", status.Conditions[1].Type)
// Check the albums were created.
listRsp, err := client.List(ctx, &pbresource.ListRequest{
Type: TypeV2Album,
Tenancy: readRsp.Resource.Id.Tenancy,
})
require.NoError(t, err)
require.Len(t, listRsp.Resources, 10)
// Delete an album.
_, err = client.Delete(ctx, &pbresource.DeleteRequest{Id: listRsp.Resources[0].Id})
require.NoError(t, err)
// Call the reconciler again.
require.NoError(t, rec.Reconcile(ctx, runtime, req))
// Check the album was recreated.
listRsp, err = client.List(ctx, &pbresource.ListRequest{
Type: TypeV2Album,
Tenancy: readRsp.Resource.Id.Tenancy,
})
require.NoError(t, err)
require.Len(t, listRsp.Resources, 10)
// Set the genre to DISCO.
readRsp, err = client.Read(ctx, &pbresource.ReadRequest{Id: writeRsp.Resource.Id})
require.NoError(t, err)
res = readRsp.Resource
require.NoError(t, res.Data.UnmarshalTo(&artist))
artist.Genre = pbdemov2.Genre_GENRE_DISCO
require.NoError(t, res.Data.MarshalFrom(&artist))
_, err = client.Write(ctx, &pbresource.WriteRequest{Resource: res})
require.NoError(t, err)
// Call the reconciler again.
require.NoError(t, rec.Reconcile(ctx, runtime, req))
// Check there are only 3 albums now.
listRsp, err = client.List(ctx, &pbresource.ListRequest{
Type: TypeV2Album,
Tenancy: readRsp.Resource.Id.Tenancy,
})
require.NoError(t, err)
require.Len(t, listRsp.Resources, 3)
}