1package integration
2
3import (
4	"context"
5	"testing"
6
7	"github.com/linode/linodego"
8)
9
10var testNodeBalancerConfigCreateOpts = linodego.NodeBalancerConfigCreateOptions{
11	Port:      80,
12	Protocol:  linodego.ProtocolHTTP,
13	Algorithm: linodego.AlgorithmRoundRobin,
14}
15
16func TestCreateNodeBalancerConfig(t *testing.T) {
17	_, _, config, teardown, err := setupNodeBalancerConfig(t, "fixtures/TestCreateNodeBalancerConfig")
18	defer teardown()
19
20	if err != nil {
21		t.Errorf("Error creating NodeBalancer Config, got error %v", err)
22	}
23
24	expected := testNodeBalancerConfigCreateOpts
25
26	// cant compare Target, fixture IPs are sanitized
27	if config.Port != expected.Port || config.Protocol != expected.Protocol {
28		t.Errorf("NodeBalancerConfig did not match CreateOptions")
29	}
30}
31
32func TestUpdateNodeBalancerConfig(t *testing.T) {
33	client, nodebalancer, config, teardown, err := setupNodeBalancerConfig(t, "fixtures/TestUpdateNodeBalancerConfig")
34	defer teardown()
35	if err != nil {
36		t.Error(err)
37	}
38
39	updateOpts := linodego.NodeBalancerConfigUpdateOptions{
40		Port:          8080,
41		Protocol:      linodego.ProtocolTCP,
42		ProxyProtocol: linodego.ProxyProtocolV2,
43		Algorithm:     linodego.AlgorithmLeastConn,
44	}
45	configUpdated, err := client.UpdateNodeBalancerConfig(context.Background(), nodebalancer.ID, config.ID, updateOpts)
46	if err != nil {
47		t.Errorf("Error updating NodeBalancer Config, %s", err)
48	}
49	if configUpdated.Port != updateOpts.Port ||
50		string(updateOpts.Algorithm) != string(configUpdated.Algorithm) ||
51		string(updateOpts.Protocol) != string(configUpdated.Protocol) ||
52		string(updateOpts.ProxyProtocol) != string(configUpdated.ProxyProtocol) {
53		t.Errorf("NodeBalancerConfig did not match UpdateOptions")
54	}
55}
56
57func TestListNodeBalancerConfigs(t *testing.T) {
58	client, nodebalancer, _, teardown, err := setupNodeBalancerConfig(t, "fixtures/TestListNodeBalancerConfigs")
59	defer teardown()
60	if err != nil {
61		t.Error(err)
62	}
63
64	listOpts := linodego.NewListOptions(0, "")
65	configs, err := client.ListNodeBalancerConfigs(context.Background(), nodebalancer.ID, listOpts)
66	if err != nil {
67		t.Errorf("Error listing nodebalancers configs, expected array, got error %v", err)
68	}
69	if len(configs) != listOpts.Results {
70		t.Errorf("Expected ListNodeBalancerConfigs to match API result count")
71	}
72}
73
74func TestListNodeBalancerConfigsMultiplePages(t *testing.T) {
75	// This fixture was hand-crafted to render an empty page 1 result, with a single result on page 2
76	// "results:1,data:[],page:1,pages:2"  .. "results:1,data[{...}],page:2,pages:2"
77	client, nodebalancer, _, teardown, err := setupNodeBalancerConfig(t, "fixtures/TestListNodeBalancerConfigsMultiplePages")
78	defer teardown()
79	if err != nil {
80		t.Error(err)
81	}
82
83	listOpts := linodego.NewListOptions(0, "")
84	configs, err := client.ListNodeBalancerConfigs(context.Background(), nodebalancer.ID, listOpts)
85	if err != nil {
86		t.Errorf("Error listing nodebalancers configs, expected array, got error %v", err)
87	}
88	if len(configs) != listOpts.Results {
89		t.Errorf("Expected ListNodeBalancerConfigs count to match API results count")
90	}
91}
92
93func TestGetNodeBalancerConfig(t *testing.T) {
94	client, nodebalancer, config, teardown, err := setupNodeBalancerConfig(t, "fixtures/TestGetNodeBalancerConfig")
95	defer teardown()
96	if err != nil {
97		t.Error(err)
98	}
99
100	configGot, err := client.GetNodeBalancerConfig(context.Background(), nodebalancer.ID, config.ID)
101	if configGot.Port != config.Port {
102		t.Errorf("GetNodeBalancerConfig did not get the expected config")
103	}
104	if err != nil {
105		t.Errorf("Error getting nodebalancer %d, got error %v", nodebalancer.ID, err)
106	}
107}
108
109func setupNodeBalancerConfig(t *testing.T, fixturesYaml string) (*linodego.Client, *linodego.NodeBalancer, *linodego.NodeBalancerConfig, func(), error) {
110	t.Helper()
111	var fixtureTeardown func()
112	client, nodebalancer, fixtureTeardown, err := setupNodeBalancer(t, fixturesYaml)
113	if err != nil {
114		t.Errorf("Error creating nodebalancer, got error %v", err)
115	}
116
117	createOpts := testNodeBalancerConfigCreateOpts
118	config, err := client.CreateNodeBalancerConfig(context.Background(), nodebalancer.ID, createOpts)
119	if err != nil {
120		t.Errorf("Error creating NodeBalancer Config, got error %v", err)
121	}
122
123	teardown := func() {
124		// delete the NodeBalancerConfig to exercise the code
125		if err := client.DeleteNodeBalancerConfig(context.Background(), nodebalancer.ID, config.ID); err != nil {
126			t.Errorf("Expected to delete a NodeBalancer Config, but got %v", err)
127		}
128		fixtureTeardown()
129	}
130	return client, nodebalancer, config, teardown, err
131}
132