Ctrl K
ComunidadGuías…

coderd/chat_project_skills_test.go

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

Archivo original ↗Preguntar a KiBot
package coderd_test

import (
	"fmt"
	"net/http"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/coder/coder/v2/coderd/coderdtest"
	"github.com/coder/coder/v2/coderd/util/ptr"
	"github.com/coder/coder/v2/coderd/x/skills"
	"github.com/coder/coder/v2/codersdk"
	"github.com/coder/coder/v2/testutil"
)

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

	ctx := testutil.Context(t, testutil.WaitLong)
	client, _ := newChatProjectClient(t)
	orgID := coderdtest.CreateFirstUser(t, client.Client).OrganizationID
	project := createChatProject(t, client, orgID, "Skills Project")
	memberRaw, _ := coderdtest.CreateAnotherUser(t, client.Client, orgID)
	member := codersdk.NewExperimentalClient(memberRaw)
	content := userSkillMarkdown("deploy", "Deploy the app", "Run make deploy.")

	created, err := client.CreateChatProjectSkill(ctx, orgID, project.ID, codersdk.CreateSkillRequest{
		Content:        content,
		Action:         ptr.Ref(true),
		ModelInvocable: ptr.Ref(false),
	})
	require.NoError(t, err)
	require.Equal(t, "Deploy the app", created.Description)
	require.True(t, created.Action)
	require.False(t, created.ModelInvocable)
	list, err := client.ChatProjectSkills(ctx, orgID, project.ID)
	require.NoError(t, err)
	require.Equal(t, []codersdk.SkillMetadata{created.SkillMetadata}, list)

	updated, err := client.UpdateChatProjectSkill(ctx, orgID, project.ID, "deploy", codersdk.UpdateSkillRequest{
		Content: ptr.Ref(userSkillMarkdown("deploy", "Ship the app", "Run make ship.")),
		Enabled: ptr.Ref(false),
	})
	require.NoError(t, err)
	require.Equal(t, "Ship the app", updated.Description)
	require.False(t, updated.Enabled)
	// Omitted settings keep their values, and set ones flip independently.
	require.True(t, updated.Action)
	require.False(t, updated.ModelInvocable)
	updated, err = client.UpdateChatProjectSkill(ctx, orgID, project.ID, "deploy", codersdk.UpdateSkillRequest{
		Action:         ptr.Ref(false),
		ModelInvocable: ptr.Ref(true),
	})
	require.NoError(t, err)
	require.False(t, updated.Action)
	require.True(t, updated.ModelInvocable)
	require.Equal(t, "Ship the app", updated.Description)

	_, err = client.CreateChatProjectSkill(ctx, orgID, project.ID, codersdk.CreateSkillRequest{Content: content})
	requireSDKErrorStatus(t, err, http.StatusConflict)
	_, err = client.UpdateChatProjectSkill(ctx, orgID, project.ID, "deploy", codersdk.UpdateSkillRequest{
		Content: ptr.Ref(userSkillMarkdown("other", "Other", "Body.")),
	})
	requireSDKErrorStatus(t, err, http.StatusBadRequest)

	// A member who cannot read the project gets 404 on every route.
	for i, call := range []func() error{
		func() error { _, err := member.ChatProjectSkills(ctx, orgID, project.ID); return err },
		func() error { _, err := member.ChatProjectSkill(ctx, orgID, project.ID, "deploy"); return err },
		func() error {
			_, err := member.CreateChatProjectSkill(ctx, orgID, project.ID, codersdk.CreateSkillRequest{Content: content})
			return err
		},
		func() error {
			_, err := member.UpdateChatProjectSkill(ctx, orgID, project.ID, "deploy", codersdk.UpdateSkillRequest{Enabled: ptr.Ref(true)})
			return err
		},
		func() error { return member.DeleteChatProjectSkill(ctx, orgID, project.ID, "deploy") },
	} {
		requireSDKErrorStatus(t, call(), http.StatusNotFound, "member call %d", i)
	}
	// Reads return the update, and rejected writes leave it alone.
	got, err := client.ChatProjectSkill(ctx, orgID, project.ID, "deploy")
	require.NoError(t, err)
	require.Equal(t, updated, got)

	require.NoError(t, client.DeleteChatProjectSkill(ctx, orgID, project.ID, "deploy"))
	_, err = client.ChatProjectSkill(ctx, orgID, project.ID, "deploy")
	requireSDKErrorStatus(t, err, http.StatusNotFound)

	for i := range skills.MaxPersonalSkillsPerUser {
		_, err := client.CreateChatProjectSkill(ctx, orgID, project.ID, codersdk.CreateSkillRequest{Content: userSkillMarkdown(fmt.Sprintf("skill-%03d", i), "Limit", "Body.")})
		require.NoError(t, err)
	}
	_, err = client.CreateChatProjectSkill(ctx, orgID, project.ID, codersdk.CreateSkillRequest{Content: content})
	require.Equal(t, "Project skill limit reached.", requireSDKErrorStatus(t, err, http.StatusConflict).Message)
}