File: database_test.go

package info (click to toggle)
golang-github-linode-linodego 1.55.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,112 kB
  • sloc: makefile: 96; sh: 52; python: 24
file content (153 lines) | stat: -rw-r--r-- 5,087 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package unit

import (
	"context"
	"encoding/json"
	"fmt"
	"slices"
	"testing"

	"github.com/linode/linodego"
	"github.com/stretchr/testify/assert"
)

func TestListDatabases(t *testing.T) {
	fixtureData, err := fixtures.GetFixture("databases_list")
	assert.NoError(t, err)

	var base ClientBaseCase
	base.SetUp(t)
	defer base.TearDown(t)

	base.MockGet("databases/instances", fixtureData)
	databases, err := base.Client.ListDatabases(context.Background(), &linodego.ListOptions{})
	assert.NoError(t, err)
	assert.NotEmpty(t, databases, "Expected non-empty database list")
}

func TestGetDatabaseEngine(t *testing.T) {
	fixtureData, err := fixtures.GetFixture("database_engine_get")
	assert.NoError(t, err)

	var base ClientBaseCase
	base.SetUp(t)
	defer base.TearDown(t)

	engineID := "mysql-8"
	base.MockGet(fmt.Sprintf("databases/engines/%s", engineID), fixtureData)
	databaseEngine, err := base.Client.GetDatabaseEngine(context.Background(), &linodego.ListOptions{}, engineID)
	assert.NoError(t, err)
	assert.NotNil(t, databaseEngine, "Expected database engine object to be returned")
	assert.Equal(t, engineID, databaseEngine.ID, "Expected correct database engine ID")
	assert.Equal(t, "mysql", databaseEngine.Engine, "Expected MySQL engine")
	assert.Equal(t, "8.0", databaseEngine.Version, "Expected MySQL 8.0 version")
}

func TestListDatabaseTypes(t *testing.T) {
	fixtureData, err := fixtures.GetFixture("database_types_list")
	assert.NoError(t, err)

	var base ClientBaseCase
	base.SetUp(t)
	defer base.TearDown(t)

	base.MockGet("databases/types", fixtureData)
	databaseTypes, err := base.Client.ListDatabaseTypes(context.Background(), &linodego.ListOptions{})
	assert.NoError(t, err)
	assert.NotEmpty(t, databaseTypes, "Expected non-empty database types list")
}

func TestUnmarshalDatabase(t *testing.T) {
	fixtureData, err := fixtures.GetFixture("database_unmarshal")
	assert.NoError(t, err)

	var data []byte
	switch v := fixtureData.(type) {
	case []byte:
		data = v
	case string:
		data = []byte(v)
	case map[string]interface{}:
		data, err = json.Marshal(v) // Convert map to JSON string
		assert.NoError(t, err, "Failed to marshal fixtureData")
	default:
		assert.Fail(t, "Unexpected fixtureData type")
	}

	var db linodego.Database
	err = json.Unmarshal(data, &db)
	assert.NoError(t, err)
	assert.Equal(t, 123, db.ID, "Expected correct database ID")
	assert.Equal(t, "active", string(db.Status), "Expected active status")
	assert.Equal(t, "mysql", db.Engine, "Expected MySQL engine")
	assert.Equal(t, 3, db.ClusterSize, "Expected cluster size 3")
	assert.NotNil(t, db.Created, "Expected Created timestamp to be set")
}

func TestDatabaseMaintenanceWindowUnmarshal(t *testing.T) {
	fixtureData, err := fixtures.GetFixture("database_maintenance_window")
	assert.NoError(t, err)

	var data []byte
	switch v := fixtureData.(type) {
	case []byte:
		data = v
	case string:
		data = []byte(v)
	case map[string]interface{}:
		data, err = json.Marshal(v)
		assert.NoError(t, err, "Failed to marshal fixtureData")
	default:
		assert.Fail(t, "Unexpected fixtureData type")
	}

	var window linodego.DatabaseMaintenanceWindow
	err = json.Unmarshal(data, &window)
	assert.NoError(t, err)
	assert.Equal(t, linodego.DatabaseMaintenanceDayMonday, window.DayOfWeek, "Expected Monday as maintenance day")
	assert.Equal(t, 2, window.Duration, "Expected 2-hour maintenance window")
	assert.Equal(t, linodego.DatabaseMaintenanceFrequencyWeekly, window.Frequency, "Expected weekly frequency")
	assert.Equal(t, 3, window.HourOfDay, "Expected maintenance at 3 AM")
}

func TestDatabaseStatusAssertions(t *testing.T) {
	expectedStatuses := []string{
		"provisioning", "active", "deleting", "deleted",
		"suspending", "suspended", "resuming", "restoring",
		"failed", "degraded", "updating", "backing_up",
	}

	statuses := []linodego.DatabaseStatus{
		linodego.DatabaseStatusProvisioning, linodego.DatabaseStatusActive, linodego.DatabaseStatusDeleting,
		linodego.DatabaseStatusDeleted, linodego.DatabaseStatusSuspending, linodego.DatabaseStatusSuspended,
		linodego.DatabaseStatusResuming, linodego.DatabaseStatusRestoring, linodego.DatabaseStatusFailed,
		linodego.DatabaseStatusDegraded, linodego.DatabaseStatusUpdating, linodego.DatabaseStatusBackingUp,
	}

	for _, status := range statuses {
		t.Run(string(status), func(t *testing.T) {
			exists := slices.ContainsFunc(expectedStatuses, func(s string) bool {
				return s == string(status)
			})
			assert.True(t, exists, fmt.Sprintf("Expected status %s to exist", status))
		})
	}
}

func TestDatabaseMaintenanceFrequencyAssertions(t *testing.T) {
	expectedFrequencies := []string{"weekly", "monthly"}

	frequencies := []linodego.DatabaseMaintenanceFrequency{
		linodego.DatabaseMaintenanceFrequencyWeekly,
		linodego.DatabaseMaintenanceFrequencyMonthly,
	}

	for _, freq := range frequencies {
		t.Run(string(freq), func(t *testing.T) {
			exists := slices.ContainsFunc(expectedFrequencies, func(f string) bool {
				return f == string(freq)
			})
			assert.True(t, exists, fmt.Sprintf("Expected frequency %s to exist", freq))
		})
	}
}