Ctrl K
ComunidadGuías…

tests/license_routes_test.go

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

Archivo original ↗Preguntar a KiBot
package main

import (
	"net/http"
	"strings"
	"testing"

	"github.com/shellhub-io/shellhub/tests/environment"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var unknownSessionRecording = "/api/sessions/" + strings.Repeat("0", 64) + "/records/0"

type gatedRoute struct {
	feature  string
	path     string
	withhold func(features *environment.LicenseFeatures)
	unlocked int
}

var gatedRoutes = []gatedRoute{
	{
		feature:  "firewall",
		path:     "/api/firewall/rules",
		withhold: func(features *environment.LicenseFeatures) { features.FirewallRules = false },
		unlocked: http.StatusOK,
	},
	{
		feature:  "session recording",
		path:     unknownSessionRecording,
		withhold: func(features *environment.LicenseFeatures) { features.SessionRecording = false },
		unlocked: http.StatusNotFound,
	},
}

func testLicenseFeatureGating(t *testing.T, compose *environment.DockerCompose) {
	t.Helper()

	for _, route := range gatedRoutes {
		t.Run(route.feature+" routes answer 402 without the feature", func(t *testing.T) {
			useLicense(t, compose, fullLicenseWhere(func(license *environment.License) {
				route.withhold(license.Features)
			}))

			requireStatus(t, compose, route.path, http.StatusPaymentRequired)
		})

		t.Run(route.feature+" routes answer with the feature", func(t *testing.T) {
			useLicense(t, compose, environment.FullLicense())

			requireStatus(t, compose, route.path, route.unlocked)
		})
	}

	t.Run("an expired license answers 402 on every gated route", func(t *testing.T) {
		useLicense(t, compose, expiredLicense())

		for _, route := range gatedRoutes {
			requireStatus(t, compose, route.path, http.StatusPaymentRequired)
		}
	})

	t.Run("the license endpoint answers under an expired license", func(t *testing.T) {
		license := expiredLicense()
		useLicense(t, compose, license)

		installed := compose.InstalledLicense(t)
		assert.Equal(t, license.ID, installed.ID)
		assert.True(t, installed.Expired)

		requireStatus(t, compose, "/admin/api/users", http.StatusPaymentRequired)
	})

	t.Run("the license endpoint installs a license when none is installed", func(t *testing.T) {
		useNoLicense(t, compose)
		requireStatus(t, compose, "/admin/api/users", http.StatusPaymentRequired)

		license := environment.FullLicense()
		compose.UseLicense(t, license)

		assert.Equal(t, license.ID, compose.InstalledLicense(t).ID)
		requireStatus(t, compose, "/admin/api/users", http.StatusOK)
	})
}

func requireStatus(t *testing.T, compose *environment.DockerCompose, path string, status int) {
	t.Helper()

	resp, err := compose.R(t.Context()).Get(path)
	require.NoError(t, err)
	require.Equal(t, status, resp.StatusCode(), "GET %s: %s", path, resp.String())
}