1package internal
2
3import (
4	"encoding/json"
5	"io"
6	"io/ioutil"
7	"net/http"
8	"os"
9	"testing"
10
11	"github.com/stretchr/testify/assert"
12	"github.com/stretchr/testify/require"
13)
14
15func TestTxtRecordService_Create(t *testing.T) {
16	client, handler, tearDown := setupAPIMock()
17	defer tearDown()
18
19	handler.HandleFunc("/v1/domains/12345/records/txt", func(rw http.ResponseWriter, req *http.Request) {
20		if req.Method != http.MethodPost {
21			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
22			return
23		}
24
25		file, err := os.Open("./fixtures/records-Create.json")
26		if err != nil {
27			http.Error(rw, err.Error(), http.StatusInternalServerError)
28			return
29		}
30		defer func() { _ = file.Close() }()
31
32		_, err = io.Copy(rw, file)
33		if err != nil {
34			http.Error(rw, err.Error(), http.StatusInternalServerError)
35			return
36		}
37	})
38
39	records, err := client.TxtRecords.Create(12345, RecordRequest{})
40	require.NoError(t, err)
41
42	recordsJSON, err := json.Marshal(records)
43	require.NoError(t, err)
44
45	expectedContent, err := ioutil.ReadFile("./fixtures/records-Create.json")
46	require.NoError(t, err)
47
48	assert.JSONEq(t, string(expectedContent), string(recordsJSON))
49}
50
51func TestTxtRecordService_GetAll(t *testing.T) {
52	client, handler, tearDown := setupAPIMock()
53	defer tearDown()
54
55	handler.HandleFunc("/v1/domains/12345/records/txt", func(rw http.ResponseWriter, req *http.Request) {
56		if req.Method != http.MethodGet {
57			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
58			return
59		}
60
61		file, err := os.Open("./fixtures/records-GetAll.json")
62		if err != nil {
63			http.Error(rw, err.Error(), http.StatusInternalServerError)
64			return
65		}
66		defer func() { _ = file.Close() }()
67
68		_, err = io.Copy(rw, file)
69		if err != nil {
70			http.Error(rw, err.Error(), http.StatusInternalServerError)
71			return
72		}
73	})
74
75	records, err := client.TxtRecords.GetAll(12345)
76	require.NoError(t, err)
77
78	recordsJSON, err := json.Marshal(records)
79	require.NoError(t, err)
80
81	expectedContent, err := ioutil.ReadFile("./fixtures/records-GetAll.json")
82	require.NoError(t, err)
83
84	assert.JSONEq(t, string(expectedContent), string(recordsJSON))
85}
86
87func TestTxtRecordService_Get(t *testing.T) {
88	client, handler, tearDown := setupAPIMock()
89	defer tearDown()
90
91	handler.HandleFunc("/v1/domains/12345/records/txt/6789", func(rw http.ResponseWriter, req *http.Request) {
92		if req.Method != http.MethodGet {
93			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
94			return
95		}
96
97		file, err := os.Open("./fixtures/records-Get.json")
98		if err != nil {
99			http.Error(rw, err.Error(), http.StatusInternalServerError)
100			return
101		}
102		defer func() { _ = file.Close() }()
103
104		_, err = io.Copy(rw, file)
105		if err != nil {
106			http.Error(rw, err.Error(), http.StatusInternalServerError)
107			return
108		}
109	})
110
111	record, err := client.TxtRecords.Get(12345, 6789)
112	require.NoError(t, err)
113
114	expected := &Record{
115		ID:           3557066,
116		Type:         "TXT",
117		RecordType:   "txt",
118		Name:         "test",
119		TTL:          300,
120		RecordOption: "roundRobin",
121		GtdRegion:    1,
122		ParentID:     273302,
123		Parent:       "domain",
124		Source:       "Domain",
125		ModifiedTs:   1580908547863,
126		Value: []RecordValue{{
127			Value: `"test"`,
128		}},
129		RoundRobin: []RecordValue{{
130			Value: `"test"`,
131		}},
132	}
133	assert.Equal(t, expected, record)
134}
135
136func TestTxtRecordService_Update(t *testing.T) {
137	client, handler, tearDown := setupAPIMock()
138	defer tearDown()
139
140	handler.HandleFunc("/v1/domains/12345/records/txt/6789", func(rw http.ResponseWriter, req *http.Request) {
141		if req.Method != http.MethodPut {
142			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
143			return
144		}
145
146		_, err := rw.Write([]byte(`{"success":"Record  updated successfully"}`))
147		if err != nil {
148			http.Error(rw, err.Error(), http.StatusInternalServerError)
149			return
150		}
151	})
152
153	msg, err := client.TxtRecords.Update(12345, 6789, RecordRequest{})
154	require.NoError(t, err)
155
156	expected := &SuccessMessage{Success: "Record  updated successfully"}
157	assert.Equal(t, expected, msg)
158}
159
160func TestTxtRecordService_Delete(t *testing.T) {
161	client, handler, tearDown := setupAPIMock()
162	defer tearDown()
163
164	handler.HandleFunc("/v1/domains/12345/records/txt/6789", func(rw http.ResponseWriter, req *http.Request) {
165		if req.Method != http.MethodDelete {
166			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
167			return
168		}
169
170		_, err := rw.Write([]byte(`{"success":"Record  deleted successfully"}`))
171		if err != nil {
172			http.Error(rw, err.Error(), http.StatusInternalServerError)
173			return
174		}
175	})
176
177	msg, err := client.TxtRecords.Delete(12345, 6789)
178	require.NoError(t, err)
179
180	expected := &SuccessMessage{Success: "Record  deleted successfully"}
181	assert.Equal(t, expected, msg)
182}
183
184func TestTxtRecordService_Search(t *testing.T) {
185	client, handler, tearDown := setupAPIMock()
186	defer tearDown()
187
188	handler.HandleFunc("/v1/domains/12345/records/txt/search", func(rw http.ResponseWriter, req *http.Request) {
189		if req.Method != http.MethodGet {
190			http.Error(rw, "invalid method: "+req.Method, http.StatusBadRequest)
191			return
192		}
193
194		file, err := os.Open("./fixtures/records-Search.json")
195		if err != nil {
196			http.Error(rw, err.Error(), http.StatusInternalServerError)
197			return
198		}
199		defer func() { _ = file.Close() }()
200
201		_, err = io.Copy(rw, file)
202		if err != nil {
203			http.Error(rw, err.Error(), http.StatusInternalServerError)
204			return
205		}
206	})
207
208	records, err := client.TxtRecords.Search(12345, Exact, "test")
209	require.NoError(t, err)
210
211	recordsJSON, err := json.Marshal(records)
212	require.NoError(t, err)
213
214	expectedContent, err := ioutil.ReadFile("./fixtures/records-Search.json")
215	require.NoError(t, err)
216
217	assert.JSONEq(t, string(expectedContent), string(recordsJSON))
218}
219