Skip to content

Commit f363597

Browse files
authored
Merge pull request #53 from OpenVPN/feature/vpn-regions-api
Add VPN Regions support with List, GetByPage, and GetByID methods
2 parents 6d9bde3 + bc167d1 commit f363597

File tree

4 files changed

+147
-1
lines changed

4 files changed

+147
-1
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@ user := cloudconnexa.User{
105105
createdUser, err := client.Users.Create(user)
106106
```
107107

108+
### Listing VPN Regions
109+
110+
```go
111+
// List all VPN regions
112+
regions, err := client.VPNRegions.List()
113+
if err != nil {
114+
log.Fatalf("error getting VPN regions: %v", err)
115+
}
116+
117+
// Get specific region by ID
118+
region, err := client.VPNRegions.GetByID("region-id")
119+
```
120+
108121
## Contributing
109122

110123
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

cloudconnexa/vpn_regions.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,28 @@ type VpnRegion struct {
1616

1717
type VPNRegionsService service
1818

19-
func (c *VPNRegionsService) GetVpnRegion(regionID string) (*VpnRegion, error) {
19+
// List retrieves all VPN regions
20+
func (c *VPNRegionsService) List() ([]VpnRegion, error) {
21+
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/regions", c.client.GetV1Url()), nil)
22+
if err != nil {
23+
return nil, err
24+
}
25+
26+
body, err := c.client.DoRequest(req)
27+
if err != nil {
28+
return nil, err
29+
}
30+
31+
var regions []VpnRegion
32+
err = json.Unmarshal(body, &regions)
33+
if err != nil {
34+
return nil, err
35+
}
36+
return regions, nil
37+
}
38+
39+
// GetByID retrieves a specific VPN region by ID
40+
func (c *VPNRegionsService) GetByID(regionID string) (*VpnRegion, error) {
2041
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("%s/regions", c.client.GetV1Url()), nil)
2142
if err != nil {
2243
return nil, err

cloudconnexa/vpn_regions_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package cloudconnexa
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
var testVpnRegion = VpnRegion{
13+
ID: "test-region",
14+
Country: "Test Country",
15+
Continent: "Test Continent",
16+
CountryISO: "TC",
17+
RegionName: "Test Region",
18+
}
19+
20+
func TestVPNRegionsService_List(t *testing.T) {
21+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
22+
// Handle auth token request
23+
if r.URL.Path == "/api/v1/oauth/token" {
24+
w.Header().Set("Content-Type", "application/json")
25+
err := json.NewEncoder(w).Encode(map[string]string{
26+
"access_token": "test-token",
27+
})
28+
assert.NoError(t, err)
29+
return
30+
}
31+
32+
// Handle VPN regions request
33+
assert.Equal(t, "/api/v1/regions", r.URL.Path)
34+
35+
regions := []VpnRegion{testVpnRegion}
36+
37+
err := json.NewEncoder(w).Encode(regions)
38+
assert.NoError(t, err)
39+
}))
40+
defer server.Close()
41+
42+
client, err := NewClient(server.URL, "test", "test")
43+
assert.NoError(t, err)
44+
regions, err := client.VPNRegions.List()
45+
46+
assert.NoError(t, err)
47+
assert.Equal(t, 1, len(regions))
48+
assert.Equal(t, testVpnRegion.ID, regions[0].ID)
49+
}
50+
51+
func TestVPNRegionsService_GetByID(t *testing.T) {
52+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
53+
// Handle auth token request
54+
if r.URL.Path == "/api/v1/oauth/token" {
55+
w.Header().Set("Content-Type", "application/json")
56+
err := json.NewEncoder(w).Encode(map[string]string{
57+
"access_token": "test-token",
58+
})
59+
assert.NoError(t, err)
60+
return
61+
}
62+
63+
// Handle VPN regions request
64+
assert.Equal(t, "/api/v1/regions", r.URL.Path)
65+
66+
err := json.NewEncoder(w).Encode([]VpnRegion{testVpnRegion})
67+
assert.NoError(t, err)
68+
}))
69+
defer server.Close()
70+
71+
client, err := NewClient(server.URL, "test", "test")
72+
assert.NoError(t, err)
73+
74+
// Test existing region
75+
region, err := client.VPNRegions.GetByID(testVpnRegion.ID)
76+
assert.NoError(t, err)
77+
assert.NotNil(t, region)
78+
assert.Equal(t, testVpnRegion.ID, region.ID)
79+
80+
// Test non-existent region
81+
region, err = client.VPNRegions.GetByID("non-existent")
82+
assert.NoError(t, err)
83+
assert.Nil(t, region)
84+
}

e2e/client_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,34 @@ func TestListConnectors(t *testing.T) {
5555
fmt.Printf("found %d connectors\n", len(response.Content))
5656
}
5757

58+
func TestVPNRegions(t *testing.T) {
59+
c := setUpClient(t)
60+
61+
// Test List
62+
regions, err := c.VPNRegions.List()
63+
require.NoError(t, err)
64+
require.NotNil(t, regions)
65+
fmt.Printf("found %d VPN regions\n", len(regions))
66+
67+
// If regions exist, test GetByID
68+
if len(regions) > 0 {
69+
region := regions[0]
70+
foundRegion, err := c.VPNRegions.GetByID(region.ID)
71+
require.NoError(t, err)
72+
require.NotNil(t, foundRegion)
73+
require.Equal(t, region.ID, foundRegion.ID)
74+
require.Equal(t, region.Country, foundRegion.Country)
75+
require.Equal(t, region.Continent, foundRegion.Continent)
76+
fmt.Printf("successfully found region %s in %s, %s\n",
77+
foundRegion.ID, foundRegion.Country, foundRegion.Continent)
78+
}
79+
80+
// Test GetByID with non-existent ID
81+
nonExistentRegion, err := c.VPNRegions.GetByID("non-existent-id")
82+
require.NoError(t, err)
83+
require.Nil(t, nonExistentRegion)
84+
}
85+
5886
func TestCreateNetwork(t *testing.T) {
5987
c := setUpClient(t)
6088
timestamp := time.Now().Unix()

0 commit comments

Comments
 (0)