Ctrl K
ComunidadGuías…

coderd/chat_project_memories_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package coderd_test

import (
	"testing"

	"github.com/google/uuid"
	"github.com/stretchr/testify/require"

	"github.com/coder/coder/v2/coderd/coderdtest"
	"github.com/coder/coder/v2/coderd/database"
	"github.com/coder/coder/v2/coderd/database/dbgen"
	"github.com/coder/coder/v2/coderd/rbac"
	"github.com/coder/coder/v2/codersdk"
	"github.com/coder/coder/v2/testutil"
)

func TestChatProjectMemoriesCRUD(t *testing.T) {
	t.Parallel()

	ctx := testutil.Context(t, testutil.WaitLong)
	client, db := newChatProjectClient(t)
	firstUser := coderdtest.CreateFirstUser(t, client.Client)
	project := createChatProject(t, client, firstUser.OrganizationID, "Memory Project")

	created, err := client.CreateChatProjectMemory(ctx, project.OrganizationID, project.ID, codersdk.CreateChatProjectMemoryRequest{
		Name:        "release-process",
		Description: "Release process notes",
		Body:        "Use the release checklist before tagging.",
	})
	require.NoError(t, err)
	require.Equal(t, project.ID, created.ProjectID)
	require.Equal(t, firstUser.UserID, created.CreatedBy)
	require.NotEmpty(t, created.CreatedByUsername)

	memories, err := client.ListChatProjectMemories(ctx, project.OrganizationID, project.ID)
	require.NoError(t, err)
	require.Len(t, memories, 1)
	require.Equal(t, created.ID, memories[0].ID)

	got, err := client.GetChatProjectMemory(ctx, project.OrganizationID, project.ID, created.ID)
	require.NoError(t, err)
	require.Equal(t, created.Body, got.Body)

	_, err = client.CreateChatProjectMemory(ctx, project.OrganizationID, project.ID, codersdk.CreateChatProjectMemoryRequest{
		Name:        "Not A Valid Name",
		Description: "Invalid",
		Body:        "Invalid body.",
	})
	require.Equal(t, 400, coderdtest.SDKError(t, err).StatusCode())

	_, err = client.CreateChatProjectMemory(ctx, project.OrganizationID, project.ID, codersdk.CreateChatProjectMemoryRequest{
		Name:        "release-process",
		Description: "Duplicate",
		Body:        "Duplicate body.",
	})
	require.Equal(t, 409, coderdtest.SDKError(t, err).StatusCode())

	otherOrganization := dbgen.Organization(t, db, database.Organization{IsDefault: false})
	otherRaw, _ := coderdtest.CreateAnotherUser(t, client.Client, otherOrganization.ID)
	other := codersdk.NewExperimentalClient(otherRaw)
	_, err = other.GetChatProjectMemory(ctx, project.OrganizationID, project.ID, created.ID)
	require.Equal(t, 404, coderdtest.SDKError(t, err).StatusCode())

	// Memory is private to the project creator like the project itself; org
	// admins manage every project's memory.
	memberRaw, _ := coderdtest.CreateAnotherUser(t, client.Client, firstUser.OrganizationID)
	member := codersdk.NewExperimentalClient(memberRaw)
	_, err = member.ListChatProjectMemories(ctx, project.OrganizationID, project.ID)
	require.Equal(t, 404, coderdtest.SDKError(t, err).StatusCode())
	_, err = member.GetChatProjectMemory(ctx, project.OrganizationID, project.ID, created.ID)
	require.Equal(t, 404, coderdtest.SDKError(t, err).StatusCode())

	adminRaw, adminUser := coderdtest.CreateAnotherUser(t, client.Client, firstUser.OrganizationID,
		rbac.ScopedRoleOrgAdmin(firstUser.OrganizationID))
	admin := codersdk.NewExperimentalClient(adminRaw)
	memories, err = admin.ListChatProjectMemories(ctx, project.OrganizationID, project.ID)
	require.NoError(t, err)
	require.Len(t, memories, 1)
	adminCreated, err := admin.CreateChatProjectMemory(ctx, project.OrganizationID, project.ID, codersdk.CreateChatProjectMemoryRequest{
		Name:        "admin-note",
		Description: "Added by an org admin",
		Body:        "Admins contribute memory too.",
	})
	require.NoError(t, err)
	require.Equal(t, adminUser.ID, adminCreated.CreatedBy)
	require.NoError(t, admin.DeleteChatProjectMemory(ctx, project.OrganizationID, project.ID, created.ID))
}

func TestChatProjectMemoryCap(t *testing.T) {
	t.Parallel()

	ctx := testutil.Context(t, testutil.WaitLong)
	client, db := newChatProjectClient(t)
	firstUser := coderdtest.CreateFirstUser(t, client.Client)
	project := createChatProject(t, client, firstUser.OrganizationID, "Capped Memory Project")

	for i := range 200 {
		dbgen.ChatProjectMemory(t, db, database.ChatProjectMemory{
			ProjectID:      project.ID,
			OrganizationID: firstUser.OrganizationID,
			CreatedBy:      firstUser.UserID,
			Name:           "memory-" + uuid.NewString() + string(rune('a'+i%26)),
			Description:    "Seeded memory",
			Body:           "Seeded durable memory.",
		})
	}

	_, err := client.CreateChatProjectMemory(ctx, project.OrganizationID, project.ID, codersdk.CreateChatProjectMemoryRequest{
		Name:        "one-too-many",
		Description: "Too many memories",
		Body:        "This should be rejected.",
	})
	require.Equal(t, 409, coderdtest.SDKError(t, err).StatusCode())
}