138 lines
3.7 KiB
Go
138 lines
3.7 KiB
Go
package utils_test
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/fiskerinc/cloud-services/pkg/utils"
|
|
)
|
|
|
|
func TestParseVINFromRequestBothFormats(t *testing.T) {
|
|
testVIN := "1F15K3R45N1234567"
|
|
|
|
tests := []struct {
|
|
name string
|
|
headerName string
|
|
headerValue string
|
|
expectedVIN string
|
|
expectedError bool
|
|
description string
|
|
}{
|
|
{
|
|
name: "SDK 1.2 format - Ssl-Client-Subject-Dn",
|
|
headerName: "Ssl-Client-Subject-Dn",
|
|
headerValue: "CN=" + testVIN,
|
|
expectedVIN: testVIN,
|
|
expectedError: false,
|
|
description: "Should parse VIN from SDK 1.2 Ssl-Client-Subject-Dn header",
|
|
},
|
|
{
|
|
name: "SDK 1.4 format - Ssl header",
|
|
headerName: "Ssl",
|
|
headerValue: "CN=" + testVIN,
|
|
expectedVIN: testVIN,
|
|
expectedError: false,
|
|
description: "Should parse VIN from SDK 1.4 Ssl header",
|
|
},
|
|
{
|
|
name: "Both headers present - should prefer SDK 1.2",
|
|
headerName: "both",
|
|
headerValue: "CN=" + testVIN,
|
|
expectedVIN: testVIN,
|
|
expectedError: false,
|
|
description: "When both headers present, should use SDK 1.2 format first",
|
|
},
|
|
{
|
|
name: "No VIN headers present",
|
|
headerName: "none",
|
|
headerValue: "",
|
|
expectedVIN: "",
|
|
expectedError: true,
|
|
description: "Should return error when no VIN headers are present",
|
|
},
|
|
{
|
|
name: "Invalid header format - no CN prefix",
|
|
headerName: "Ssl-Client-Subject-Dn",
|
|
headerValue: testVIN, // Missing CN= prefix
|
|
expectedVIN: "",
|
|
expectedError: true,
|
|
description: "Should return error when header doesn't have CN= prefix",
|
|
},
|
|
{
|
|
name: "Empty CN value",
|
|
headerName: "Ssl",
|
|
headerValue: "CN=",
|
|
expectedVIN: "",
|
|
expectedError: true,
|
|
description: "Should return error when CN value is empty",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Create HTTP request
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
|
|
// Set headers based on test case
|
|
switch tt.headerName {
|
|
case "Ssl-Client-Subject-Dn":
|
|
req.Header.Set("Ssl-Client-Subject-Dn", tt.headerValue)
|
|
case "Ssl":
|
|
req.Header.Set("Ssl", tt.headerValue)
|
|
case "both":
|
|
req.Header.Set("Ssl-Client-Subject-Dn", tt.headerValue)
|
|
req.Header.Set("Ssl", "CN=DIFFERENT_VIN") // Should not be used
|
|
case "none":
|
|
// Don't set any headers
|
|
}
|
|
|
|
// Call function under test
|
|
vin, err := utils.ParseVINFromRequest(req)
|
|
|
|
// Verify results
|
|
if tt.expectedError {
|
|
if err == nil {
|
|
t.Errorf("%s: expected error but got none", tt.description)
|
|
}
|
|
} else {
|
|
if err != nil {
|
|
t.Errorf("%s: unexpected error: %v", tt.description, err)
|
|
}
|
|
if vin != tt.expectedVIN {
|
|
t.Errorf("%s: expected VIN %s, got %s", tt.description, tt.expectedVIN, vin)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// Test backward compatibility - existing SDK 1.2 test should still pass
|
|
func TestParseVINFromRequestLegacy(t *testing.T) {
|
|
const subjectDNHeader = "Ssl-Client-Subject-Dn"
|
|
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set(subjectDNHeader, "CN=1F15K3R45N1234567")
|
|
|
|
vin, err := utils.ParseVINFromRequest(req)
|
|
if err != nil {
|
|
t.Errorf("TestParseVINFromRequestLegacy: unexpected error: %v", err)
|
|
}
|
|
if vin != "1F15K3R45N1234567" {
|
|
t.Errorf("TestParseVINFromRequestLegacy: expected VIN 1F15K3R45N1234567, got %s", vin)
|
|
}
|
|
}
|
|
|
|
// Test SDK 1.4 specific format
|
|
func TestParseVINFromRequestSDK14(t *testing.T) {
|
|
req := httptest.NewRequest("GET", "/", nil)
|
|
req.Header.Set("Ssl", "CN=1F15K3R45N1234567")
|
|
|
|
vin, err := utils.ParseVINFromRequest(req)
|
|
if err != nil {
|
|
t.Errorf("TestParseVINFromRequestSDK14: unexpected error: %v", err)
|
|
}
|
|
if vin != "1F15K3R45N1234567" {
|
|
t.Errorf("TestParseVINFromRequestSDK14: expected VIN 1F15K3R45N1234567, got %s", vin)
|
|
}
|
|
}
|