github.com/kubeshop/testkube@v1.17.23/pkg/tcl/checktcl/subscription_test.go (about)

     1  // Copyright 2024 Testkube.
     2  //
     3  // Licensed as a Testkube Pro file under the Testkube Community
     4  // License (the "License"); you may not use this file except in compliance with
     5  // the License. You may obtain a copy of the License at
     6  //
     7  //	https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt
     8  
     9  package checktcl
    10  
    11  import (
    12  	"fmt"
    13  	"reflect"
    14  	"testing"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestSubscriptionChecker_GetCurrentOrganizationPlan(t *testing.T) {
    20  	tests := []struct {
    21  		name    string
    22  		orgPlan OrganizationPlan
    23  		want    OrganizationPlan
    24  		wantErr bool
    25  	}{
    26  		{
    27  			name:    "Org plan does not exist",
    28  			wantErr: true,
    29  		},
    30  		{
    31  			name: "Org plan exists",
    32  			orgPlan: OrganizationPlan{
    33  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
    34  				IsTrial:      false,
    35  				PlanStatus:   PlanStatusActive,
    36  			},
    37  			want: OrganizationPlan{
    38  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
    39  				IsTrial:      false,
    40  				PlanStatus:   PlanStatusActive,
    41  			},
    42  			wantErr: false,
    43  		},
    44  	}
    45  	for _, tt := range tests {
    46  		t.Run(tt.name, func(t *testing.T) {
    47  			c := &SubscriptionChecker{
    48  				orgPlan: tt.orgPlan,
    49  			}
    50  			got, err := c.GetCurrentOrganizationPlan()
    51  			if (err != nil) != tt.wantErr {
    52  				t.Errorf("SubscriptionChecker.GetCurrentOrganizationPlan() error = %v, wantErr %v", err, tt.wantErr)
    53  				return
    54  			}
    55  			if !reflect.DeepEqual(got, tt.want) {
    56  				t.Errorf("SubscriptionChecker.GetCurrentOrganizationPlan() = %v, want %v", got, tt.want)
    57  			}
    58  		})
    59  	}
    60  }
    61  
    62  func TestSubscriptionChecker_IsOrgPlanEnterprise(t *testing.T) {
    63  	tests := []struct {
    64  		name    string
    65  		orgPlan OrganizationPlan
    66  		want    bool
    67  		wantErr bool
    68  	}{
    69  		{
    70  			name:    "no org plan",
    71  			wantErr: true,
    72  		},
    73  		{
    74  			name: "enterprise org plan",
    75  			orgPlan: OrganizationPlan{
    76  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
    77  			},
    78  			want:    true,
    79  			wantErr: false,
    80  		},
    81  		{
    82  			name: "pro org plan",
    83  			orgPlan: OrganizationPlan{
    84  				TestkubeMode: OrganizationPlanTestkubeModePro,
    85  			},
    86  			want:    false,
    87  			wantErr: false,
    88  		},
    89  	}
    90  	for _, tt := range tests {
    91  		t.Run(tt.name, func(t *testing.T) {
    92  			c := &SubscriptionChecker{
    93  				orgPlan: tt.orgPlan,
    94  			}
    95  			got, err := c.IsOrgPlanEnterprise()
    96  			if (err != nil) != tt.wantErr {
    97  				t.Errorf("SubscriptionChecker.IsOrgPlanEnterprise() error = %v, wantErr %v", err, tt.wantErr)
    98  				return
    99  			}
   100  			if got != tt.want {
   101  				t.Errorf("SubscriptionChecker.IsOrgPlanEnterprise() = %v, want %v", got, tt.want)
   102  			}
   103  		})
   104  	}
   105  }
   106  
   107  func TestSubscriptionChecker_IsOrgPlanPro(t *testing.T) {
   108  	tests := []struct {
   109  		name    string
   110  		orgPlan OrganizationPlan
   111  		want    bool
   112  		wantErr bool
   113  	}{
   114  		{
   115  			name:    "no org plan",
   116  			wantErr: true,
   117  		},
   118  		{
   119  			name: "enterprise org plan",
   120  			orgPlan: OrganizationPlan{
   121  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
   122  			},
   123  			want:    false,
   124  			wantErr: false,
   125  		},
   126  		{
   127  			name: "pro org plan",
   128  			orgPlan: OrganizationPlan{
   129  				TestkubeMode: OrganizationPlanTestkubeModePro,
   130  			},
   131  			want:    true,
   132  			wantErr: false,
   133  		},
   134  	}
   135  	for _, tt := range tests {
   136  		t.Run(tt.name, func(t *testing.T) {
   137  			c := &SubscriptionChecker{
   138  				orgPlan: tt.orgPlan,
   139  			}
   140  			got, err := c.IsOrgPlanPro()
   141  			if (err != nil) != tt.wantErr {
   142  				t.Errorf("SubscriptionChecker.IsOrgPlanPro() error = %v, wantErr %v", err, tt.wantErr)
   143  				return
   144  			}
   145  			if got != tt.want {
   146  				t.Errorf("SubscriptionChecker.IsOrgPlanPro() = %v, want %v", got, tt.want)
   147  			}
   148  		})
   149  	}
   150  }
   151  
   152  func TestSubscriptionChecker_IsOrgPlanActive(t *testing.T) {
   153  	tests := []struct {
   154  		name    string
   155  		orgPlan OrganizationPlan
   156  		want    bool
   157  		wantErr bool
   158  	}{
   159  		{
   160  			name:    "no org plan",
   161  			wantErr: true,
   162  		},
   163  		{
   164  			name: "active org plan",
   165  			orgPlan: OrganizationPlan{
   166  				PlanStatus: PlanStatusActive,
   167  			},
   168  			want:    true,
   169  			wantErr: false,
   170  		},
   171  		{
   172  			name: "inactive org plan",
   173  			orgPlan: OrganizationPlan{
   174  				PlanStatus: PlanStatusUnpaid,
   175  			},
   176  			want:    false,
   177  			wantErr: false,
   178  		},
   179  	}
   180  	for _, tt := range tests {
   181  		t.Run(tt.name, func(t *testing.T) {
   182  			c := &SubscriptionChecker{
   183  				orgPlan: tt.orgPlan,
   184  			}
   185  			got, err := c.IsOrgPlanActive()
   186  			if (err != nil) != tt.wantErr {
   187  				t.Errorf("SubscriptionChecker.IsOrgPlanActive() error = %v, wantErr %v", err, tt.wantErr)
   188  				return
   189  			}
   190  			if got != tt.want {
   191  				t.Errorf("SubscriptionChecker.IsOrgPlanActive() = %v, want %v", got, tt.want)
   192  			}
   193  		})
   194  	}
   195  }
   196  
   197  func TestSubscriptionChecker_IsActiveOrgPlanEnterpriseForFeature(t *testing.T) {
   198  	featureName := "feature"
   199  	tests := []struct {
   200  		name    string
   201  		orgPlan OrganizationPlan
   202  		err     error
   203  	}{
   204  		{
   205  			name: "enterprise active org plan",
   206  			orgPlan: OrganizationPlan{
   207  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
   208  				IsTrial:      false,
   209  				PlanStatus:   PlanStatusActive,
   210  			},
   211  			err: nil,
   212  		},
   213  		{
   214  			name: "no org plan",
   215  			err:  fmt.Errorf("%s is a commercial feature: organization plan is not set", featureName),
   216  		},
   217  		{
   218  			name: "enterprise inactive org plan",
   219  			orgPlan: OrganizationPlan{
   220  				TestkubeMode: OrganizationPlanTestkubeModeEnterprise,
   221  				IsTrial:      false,
   222  				PlanStatus:   PlanStatusUnpaid,
   223  			},
   224  			err: fmt.Errorf("%s is not available: inactive subscription plan", featureName),
   225  		},
   226  		{
   227  			name: "non enterprise actibe org plan",
   228  			orgPlan: OrganizationPlan{
   229  				TestkubeMode: OrganizationPlanTestkubeModePro,
   230  				IsTrial:      false,
   231  				PlanStatus:   PlanStatusActive,
   232  			},
   233  			err: fmt.Errorf("%s is not allowed: wrong subscription plan", featureName),
   234  		},
   235  	}
   236  
   237  	for _, tt := range tests {
   238  		t.Run(tt.name, func(t *testing.T) {
   239  			c := &SubscriptionChecker{
   240  				orgPlan: tt.orgPlan,
   241  			}
   242  
   243  			err := c.IsActiveOrgPlanEnterpriseForFeature(featureName)
   244  			if tt.err != nil {
   245  				assert.EqualError(t, err, tt.err.Error())
   246  			} else {
   247  				assert.NoError(t, err)
   248  			}
   249  		})
   250  	}
   251  }