mirror of
https://github.com/qdm12/gluetun.git
synced 2025-12-11 13:56:50 -06:00
182 lines
4.0 KiB
Go
182 lines
4.0 KiB
Go
package models
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func Test_AllServers_MarshalJSON(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCases := map[string]struct {
|
|
allServers *AllServers
|
|
dataString string
|
|
errWrapped error
|
|
errMessage string
|
|
}{
|
|
"no provider": {
|
|
allServers: &AllServers{
|
|
ProviderToServers: map[string]Servers{},
|
|
},
|
|
dataString: `{"version":0}`,
|
|
},
|
|
"two providers": {
|
|
allServers: &AllServers{
|
|
Version: 1,
|
|
ProviderToServers: map[string]Servers{
|
|
providers.Cyberghost: {
|
|
Version: 1,
|
|
Timestamp: 1000,
|
|
Servers: []Server{
|
|
{Country: "A"},
|
|
{Country: "B"},
|
|
},
|
|
},
|
|
providers.Privado: {
|
|
Version: 2,
|
|
Timestamp: 2000,
|
|
Servers: []Server{
|
|
{City: "C"},
|
|
{City: "D"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
dataString: `{"version":1,` +
|
|
`"cyberghost":{"version":1,"timestamp":1000,"servers":[{"country":"A"},{"country":"B"}]},` +
|
|
`"privado":{"version":2,"timestamp":2000,"servers":[{"city":"C"},{"city":"D"}]}}`,
|
|
},
|
|
}
|
|
|
|
for name, testCase := range testCases {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
data, err := testCase.allServers.MarshalJSON()
|
|
assert.ErrorIs(t, err, testCase.errWrapped)
|
|
if err != nil {
|
|
assert.EqualError(t, err, testCase.errMessage)
|
|
}
|
|
require.Equal(t, testCase.dataString, string(data))
|
|
|
|
data, err = json.Marshal(testCase.allServers)
|
|
assert.ErrorIs(t, err, testCase.errWrapped)
|
|
if err != nil {
|
|
assert.EqualError(t, err, testCase.errMessage)
|
|
}
|
|
require.Equal(t, testCase.dataString, string(data))
|
|
|
|
buffer := bytes.NewBuffer(nil)
|
|
encoder := json.NewEncoder(buffer)
|
|
// encoder.SetIndent("", " ")
|
|
err = encoder.Encode(testCase.allServers)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, testCase.dataString+"\n", buffer.String())
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_AllServers_UnmarshalJSON(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
testCases := map[string]struct {
|
|
dataString string
|
|
allServers AllServers
|
|
errWrapped error
|
|
errMessage string
|
|
}{
|
|
"empty": {
|
|
dataString: "{}",
|
|
allServers: AllServers{},
|
|
},
|
|
"two known providers": {
|
|
dataString: `{"version":1,` +
|
|
`"cyberghost":{"version":1,"timestamp":1000,"servers":[{"country":"A"},{"country":"B"}]},` +
|
|
`"privado":{"version":2,"timestamp":2000,"servers":[{"city":"C"},{"city":"D"}]}}`,
|
|
allServers: AllServers{
|
|
Version: 1,
|
|
ProviderToServers: map[string]Servers{
|
|
providers.Cyberghost: {
|
|
Version: 1,
|
|
Timestamp: 1000,
|
|
Servers: []Server{
|
|
{Country: "A"},
|
|
{Country: "B"},
|
|
},
|
|
},
|
|
providers.Privado: {
|
|
Version: 2,
|
|
Timestamp: 2000,
|
|
Servers: []Server{
|
|
{City: "C"},
|
|
{City: "D"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for name, testCase := range testCases {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
data := []byte(testCase.dataString)
|
|
var allServers AllServers
|
|
|
|
err := json.Unmarshal(data, &allServers)
|
|
|
|
assert.ErrorIs(t, err, testCase.errWrapped)
|
|
if err != nil {
|
|
assert.EqualError(t, err, testCase.errMessage)
|
|
}
|
|
assert.Equal(t, testCase.allServers, allServers)
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_AllServers_JSON_Marshal_Unmarshal(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
allServers := &AllServers{
|
|
Version: 1,
|
|
ProviderToServers: map[string]Servers{
|
|
providers.Cyberghost: {
|
|
Version: 1,
|
|
Timestamp: 1000,
|
|
Servers: []Server{
|
|
{Country: "A"},
|
|
{Country: "B"},
|
|
},
|
|
},
|
|
providers.Privado: {
|
|
Version: 2,
|
|
Timestamp: 2000,
|
|
Servers: []Server{
|
|
{City: "C"},
|
|
{City: "D"},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
buffer := bytes.NewBuffer(nil)
|
|
encoder := json.NewEncoder(buffer)
|
|
encoder.SetIndent("", " ")
|
|
|
|
err := encoder.Encode(allServers)
|
|
require.NoError(t, err)
|
|
|
|
decoder := json.NewDecoder(buffer)
|
|
var result AllServers
|
|
err = decoder.Decode(&result)
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, allServers, &result)
|
|
}
|