Files
probo/pkg/thirdparty/vetting_test.go
Sacha Al Himdani 9ac71f948f Update contact email to hello@probo.com
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-09 16:45:23 +02:00

120 lines
3.3 KiB
Go

// Copyright (c) 2026 Probo Inc <hello@probo.com>.
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
package thirdparty
import (
"context"
"errors"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.probo.inc/probo/pkg/coredata"
"go.probo.inc/probo/pkg/gid"
"go.probo.inc/probo/pkg/validator"
)
func TestVetRequest_Validate(t *testing.T) {
t.Parallel()
validID := gid.New(gid.NewTenantID(), coredata.ThirdPartyEntityType)
t.Run("accepts a valid request", func(t *testing.T) {
t.Parallel()
procedure := "Focus on SOC 2"
err := VetRequest{
ID: validID,
WebsiteURL: "https://example.com",
Procedure: &procedure,
}.Validate()
require.NoError(t, err)
})
t.Run("requires id", func(t *testing.T) {
t.Parallel()
err := VetRequest{
WebsiteURL: "https://example.com",
}.Validate()
require.Error(t, err)
validationErrors, ok := errors.AsType[validator.ValidationErrors](err)
require.True(t, ok)
assert.NotEmpty(t, validationErrors.ByField("id"))
})
t.Run("requires website url", func(t *testing.T) {
t.Parallel()
err := VetRequest{ID: validID}.Validate()
require.Error(t, err)
validationErrors, ok := errors.AsType[validator.ValidationErrors](err)
require.True(t, ok)
assert.NotEmpty(t, validationErrors.ByField("website_url"))
})
t.Run("rejects an invalid third party id", func(t *testing.T) {
t.Parallel()
err := VetRequest{
ID: gid.New(gid.NewTenantID(), coredata.OrganizationEntityType),
WebsiteURL: "https://example.com",
}.Validate()
require.Error(t, err)
validationErrors, ok := errors.AsType[validator.ValidationErrors](err)
require.True(t, ok)
assert.NotEmpty(t, validationErrors.ByField("id"))
})
}
func TestSanitizeVettingError(t *testing.T) {
t.Parallel()
t.Run("returns short messages unchanged", func(t *testing.T) {
t.Parallel()
assert.Equal(t, "cannot vet third party", sanitizeVettingError(errors.New("cannot vet third party")))
})
t.Run("truncates long messages on a rune boundary", func(t *testing.T) {
t.Parallel()
msg := strings.Repeat("x", vettingErrorMessageMaxLen+10)
sanitized := sanitizeVettingError(errors.New(msg))
assert.LessOrEqual(t, len(sanitized), vettingErrorMessageMaxLen+len("…"))
assert.True(t, strings.HasSuffix(sanitized, "…"))
})
}
func TestDisabledVetter_Assess(t *testing.T) {
t.Parallel()
_, err := DisabledVetter{}.Assess(context.Background(), "https://example.com", "", nil, nil)
require.ErrorIs(t, err, ErrVettingDisabled)
}
func TestDisabledVetter_ImplementsVetter(t *testing.T) {
t.Parallel()
var _ Vetter = DisabledVetter{}
}