mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-01 06:31:59 +08:00

* feat: setup for licenses v3 integration * feat: added some more logic * feat: validator changes * chore: added a couple of todos * feat: added config parameter for licenses v3 and the boot option * feat: some typo fix * feat: added refresh licenses handler * feat: handle the start manager license activation * chore: text updates * feat: added list licenses call * chore: refactor the entire code to cleanup interfaces * fix: nil pointer error * chore: some minor edits * feat: model changes * feat: model changes * fix: utilise factory pattern * feat: added default basic plan * chore: added test cases for new license function * feat: added more test cases * chore: make the licenses id not null * feat: cosmetic changes * feat: cosmetic changes * feat: update zeus URL * chore: license testing fixes * feat: added license status and category handling for query-service * chore: added v3 support in v2 endpoint * chore: http response codes and some code cleanup * chore: added detailed test cases * chore: address review comments * chore: some misc cleanup
171 lines
4.9 KiB
Go
171 lines
4.9 KiB
Go
package model
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"go.signoz.io/signoz/pkg/query-service/model"
|
|
)
|
|
|
|
func TestNewLicenseV3(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
data []byte
|
|
pass bool
|
|
expected *LicenseV3
|
|
error error
|
|
}{
|
|
{
|
|
name: "Error for missing license id",
|
|
data: []byte(`{}`),
|
|
pass: false,
|
|
error: errors.New("id key is missing"),
|
|
},
|
|
{
|
|
name: "Error for license id not being a valid string",
|
|
data: []byte(`{"id": 10}`),
|
|
pass: false,
|
|
error: errors.New("id key is not a valid string"),
|
|
},
|
|
{
|
|
name: "Error for missing license key",
|
|
data: []byte(`{"id":"does-not-matter"}`),
|
|
pass: false,
|
|
error: errors.New("key key is missing"),
|
|
},
|
|
{
|
|
name: "Error for invalid string license key",
|
|
data: []byte(`{"id":"does-not-matter","key":10}`),
|
|
pass: false,
|
|
error: errors.New("key key is not a valid string"),
|
|
},
|
|
{
|
|
name: "Error for missing license status",
|
|
data: []byte(`{"id":"does-not-matter", "key": "does-not-matter","category":"FREE"}`),
|
|
pass: false,
|
|
error: errors.New("status key is missing"),
|
|
},
|
|
{
|
|
name: "Error for invalid string license status",
|
|
data: []byte(`{"id":"does-not-matter","key": "does-not-matter", "category":"FREE", "status":10}`),
|
|
pass: false,
|
|
error: errors.New("status key is not a valid string"),
|
|
},
|
|
{
|
|
name: "Error for missing license plan",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"ACTIVE"}`),
|
|
pass: false,
|
|
error: errors.New("plan key is missing"),
|
|
},
|
|
{
|
|
name: "Error for invalid json license plan",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"ACTIVE","plan":10}`),
|
|
pass: false,
|
|
error: errors.New("plan key is not a valid map[string]interface {}"),
|
|
},
|
|
{
|
|
name: "Error for invalid license plan",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"ACTIVE","plan":{}}`),
|
|
pass: false,
|
|
error: errors.New("name key is missing"),
|
|
},
|
|
{
|
|
name: "Parse the entire license properly",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"ACTIVE","plan":{"name":"TEAMS"},"valid_from": 1730899309,"valid_until": -1}`),
|
|
pass: true,
|
|
expected: &LicenseV3{
|
|
ID: "does-not-matter",
|
|
Key: "does-not-matter-key",
|
|
Data: map[string]interface{}{
|
|
"plan": map[string]interface{}{
|
|
"name": "TEAMS",
|
|
},
|
|
"category": "FREE",
|
|
"status": "ACTIVE",
|
|
"valid_from": float64(1730899309),
|
|
"valid_until": float64(-1),
|
|
},
|
|
PlanName: PlanNameTeams,
|
|
ValidFrom: 1730899309,
|
|
ValidUntil: -1,
|
|
Status: "ACTIVE",
|
|
IsCurrent: false,
|
|
Features: model.FeatureSet{},
|
|
},
|
|
},
|
|
{
|
|
name: "Fallback to basic plan if license status is inactive",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"INACTIVE","plan":{"name":"TEAMS"},"valid_from": 1730899309,"valid_until": -1}`),
|
|
pass: true,
|
|
expected: &LicenseV3{
|
|
ID: "does-not-matter",
|
|
Key: "does-not-matter-key",
|
|
Data: map[string]interface{}{
|
|
"plan": map[string]interface{}{
|
|
"name": "TEAMS",
|
|
},
|
|
"category": "FREE",
|
|
"status": "INACTIVE",
|
|
"valid_from": float64(1730899309),
|
|
"valid_until": float64(-1),
|
|
},
|
|
PlanName: PlanNameBasic,
|
|
ValidFrom: 1730899309,
|
|
ValidUntil: -1,
|
|
Status: "INACTIVE",
|
|
IsCurrent: false,
|
|
Features: model.FeatureSet{},
|
|
},
|
|
},
|
|
{
|
|
name: "fallback states for validFrom and validUntil",
|
|
data: []byte(`{"id":"does-not-matter","key":"does-not-matter-key","category":"FREE","status":"ACTIVE","plan":{"name":"TEAMS"},"valid_from":1234.456,"valid_until":5678.567}`),
|
|
pass: true,
|
|
expected: &LicenseV3{
|
|
ID: "does-not-matter",
|
|
Key: "does-not-matter-key",
|
|
Data: map[string]interface{}{
|
|
"plan": map[string]interface{}{
|
|
"name": "TEAMS",
|
|
},
|
|
"valid_from": 1234.456,
|
|
"valid_until": 5678.567,
|
|
"category": "FREE",
|
|
"status": "ACTIVE",
|
|
},
|
|
PlanName: PlanNameTeams,
|
|
ValidFrom: 1234,
|
|
ValidUntil: 5678,
|
|
Status: "ACTIVE",
|
|
IsCurrent: false,
|
|
Features: model.FeatureSet{},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
var licensePayload map[string]interface{}
|
|
err := json.Unmarshal(tc.data, &licensePayload)
|
|
require.NoError(t, err)
|
|
license, err := NewLicenseV3(licensePayload)
|
|
if license != nil {
|
|
license.Features = make(model.FeatureSet, 0)
|
|
delete(license.Data, "features")
|
|
}
|
|
|
|
if tc.pass {
|
|
require.NoError(t, err)
|
|
require.NotNil(t, license)
|
|
assert.Equal(t, tc.expected, license)
|
|
} else {
|
|
require.Error(t, err)
|
|
assert.EqualError(t, err, tc.error.Error())
|
|
require.Nil(t, license)
|
|
}
|
|
|
|
}
|
|
}
|