Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sundowndev
GitHub Repository: sundowndev/phoneinfoga
Path: blob/master/web/server_test.go
988 views
1
package web
2
3
import (
4
"github.com/sundowndev/phoneinfoga/v2/lib/remote/suppliers"
5
"io/ioutil"
6
"net/http"
7
"net/http/httptest"
8
"os"
9
"testing"
10
11
"github.com/stretchr/testify/assert"
12
"gopkg.in/h2non/gock.v1"
13
)
14
15
func performRequest(r http.Handler, method, path string) (*httptest.ResponseRecorder, error) {
16
req, err := http.NewRequest(method, path, nil)
17
w := httptest.NewRecorder()
18
r.ServeHTTP(w, req)
19
return w, err
20
}
21
22
func BenchmarkAPI(b *testing.B) {
23
srv, err := NewServer(true)
24
if err != nil {
25
b.Fatal(err)
26
}
27
28
b.Run("localScan - /api/numbers/:number/scan/local", func(b *testing.B) {
29
for i := 0; i < b.N; i++ {
30
res, err := performRequest(srv, http.MethodGet, "/api/numbers/3312345253/scan/local")
31
assert.Equal(b, nil, err)
32
assert.Equal(b, res.Result().StatusCode, 200)
33
}
34
})
35
}
36
37
func TestApi(t *testing.T) {
38
srv, err := NewServer(false)
39
if err != nil {
40
t.Fatal(err)
41
}
42
43
t.Run("Serve", func(t *testing.T) {
44
t.Run("detectContentType", func(t *testing.T) {
45
contentType := detectContentType("/file.hash.css", []byte{})
46
assert.Equal(t, "text/css; charset=utf-8", contentType)
47
48
contentType = detectContentType("/file.hash.js", []byte{})
49
assert.Equal(t, "text/javascript; charset=utf-8", contentType)
50
51
contentType = detectContentType("/file.hash.svg", []byte{})
52
assert.Equal(t, "image/svg+xml", contentType)
53
54
contentType = detectContentType("/file.html", []byte("<html></html>"))
55
assert.Equal(t, "text/html; charset=utf-8", contentType)
56
})
57
58
t.Run("getAllNumbers - /api/numbers", func(t *testing.T) {
59
res, err := performRequest(srv, http.MethodGet, "/api/numbers")
60
61
body, _ := ioutil.ReadAll(res.Body)
62
63
assert.Equal(t, err, nil)
64
assert.Equal(t, res.Result().StatusCode, 200)
65
assert.Equal(t, string(body), "{\"success\":true,\"numbers\":[]}")
66
})
67
68
t.Run("validate - /api/numbers/:number/validate", func(t *testing.T) {
69
t.Run("valid number", func(t *testing.T) {
70
res, err := performRequest(srv, http.MethodGet, "/api/numbers/3312345253/validate")
71
72
body, _ := ioutil.ReadAll(res.Body)
73
74
assert.Equal(t, err, nil)
75
assert.Equal(t, res.Result().StatusCode, 200)
76
assert.Equal(t, string(body), "{\"success\":true,\"message\":\"The number is valid\"}")
77
})
78
79
t.Run("invalid number", func(t *testing.T) {
80
res, err := performRequest(srv, http.MethodGet, "/api/numbers/azerty/validate")
81
82
body, _ := ioutil.ReadAll(res.Body)
83
84
assert.Equal(t, err, nil)
85
assert.Equal(t, res.Result().StatusCode, 400)
86
assert.Equal(t, `{"success":false,"error":"the given phone number is not valid"}`, string(body))
87
})
88
89
t.Run("invalid country code", func(t *testing.T) {
90
res, err := performRequest(srv, http.MethodGet, "/api/numbers/09880/validate")
91
92
body, _ := ioutil.ReadAll(res.Body)
93
94
assert.Equal(t, err, nil)
95
assert.Equal(t, res.Result().StatusCode, 400)
96
assert.Equal(t, string(body), "{\"success\":false,\"error\":\"invalid country code\"}")
97
})
98
})
99
100
t.Run("localScan - /api/numbers/:number/scan/local", func(t *testing.T) {
101
t.Run("valid number", func(t *testing.T) {
102
res, err := performRequest(srv, http.MethodGet, "/api/numbers/3312345253/scan/local")
103
104
body, _ := ioutil.ReadAll(res.Body)
105
106
assert.Equal(t, err, nil)
107
assert.Equal(t, res.Result().StatusCode, 200)
108
assert.Equal(t, string(body), `{"success":true,"result":{"raw_local":"12345253","local":"12345253","e164":"+3312345253","international":"3312345253","country_code":33,"country":"FR"}}`)
109
})
110
111
t.Run("invalid number", func(t *testing.T) {
112
res, err := performRequest(srv, http.MethodGet, "/api/numbers/9999999999/scan/local")
113
114
body, _ := ioutil.ReadAll(res.Body)
115
116
assert.Equal(t, err, nil)
117
assert.Equal(t, res.Result().StatusCode, 400)
118
assert.Equal(t, string(body), `{"success":false,"error":"invalid country code"}`)
119
})
120
})
121
122
t.Run("numverifyScan - /api/numbers/:number/scan/numverify", func(t *testing.T) {
123
t.Run("should succeed", func(t *testing.T) {
124
defer gock.Off() // Flush pending mocks after test execution
125
126
_ = os.Setenv("NUMVERIFY_API_KEY", "5ad5554ac240e4d3d31107941b35a5eb")
127
defer os.Unsetenv("NUMVERIFY_API_KEY")
128
129
number := "79516566591"
130
131
expectedResult := suppliers.NumverifyValidateResponse{
132
Valid: true,
133
Number: "79516566591",
134
LocalFormat: "9516566591",
135
InternationalFormat: "+79516566591",
136
CountryPrefix: "+7",
137
CountryCode: "RU",
138
CountryName: "Russian Federation",
139
Location: "Saint Petersburg and Leningrad Oblast",
140
Carrier: "OJSC St. Petersburg Telecom (OJSC Tele2-Saint-Petersburg)",
141
LineType: "mobile",
142
}
143
144
gock.New("https://api.apilayer.com").
145
Get("/number_verification/validate").
146
MatchHeader("Apikey", "5ad5554ac240e4d3d31107941b35a5eb").
147
MatchParam("number", number).
148
Reply(200).
149
JSON(expectedResult)
150
151
res, err := performRequest(srv, http.MethodGet, "/api/numbers/79516566591/scan/numverify")
152
assert.Equal(t, nil, err)
153
154
body, err := ioutil.ReadAll(res.Body)
155
156
assert.Equal(t, nil, err)
157
assert.Equal(t, 200, res.Result().StatusCode)
158
assert.Equal(t, `{"success":true,"result":{"valid":true,"number":"79516566591","local_format":"9516566591","international_format":"+79516566591","country_prefix":"+7","country_code":"RU","country_name":"Russian Federation","location":"Saint Petersburg and Leningrad Oblast","carrier":"OJSC St. Petersburg Telecom (OJSC Tele2-Saint-Petersburg)","line_type":"mobile"}}`, string(body))
159
160
assert.Equal(t, gock.IsDone(), true, "there should have no pending mocks")
161
})
162
163
t.Run("should handle error", func(t *testing.T) {
164
defer gock.Off() // Flush pending mocks after test execution
165
166
_ = os.Setenv("NUMVERIFY_API_KEY", "5ad5554ac240e4d3d31107941b35a5eb")
167
defer os.Unsetenv("NUMVERIFY_API_KEY")
168
169
number := "79516566591"
170
171
expectedResult := &suppliers.NumverifyErrorResponse{
172
Message: "You have exceeded your daily\\/monthly API rate limit. Please review and upgrade your subscription plan at https:\\/\\/apilayer.com\\/subscriptions to continue.",
173
}
174
175
gock.New("https://api.apilayer.com").
176
Get("/number_verification/validate").
177
MatchHeader("Apikey", "5ad5554ac240e4d3d31107941b35a5eb").
178
MatchParam("number", number).
179
Reply(429).
180
JSON(expectedResult)
181
182
res, err := performRequest(srv, http.MethodGet, "/api/numbers/79516566591/scan/numverify")
183
assert.Equal(t, nil, err)
184
185
body, err := ioutil.ReadAll(res.Body)
186
187
assert.Equal(t, nil, err)
188
assert.Equal(t, 500, res.Result().StatusCode)
189
assert.Equal(t, `{"success":false,"error":"You have exceeded your daily\\/monthly API rate limit. Please review and upgrade your subscription plan at https:\\/\\/apilayer.com\\/subscriptions to continue."}`, string(body))
190
191
assert.Equal(t, gock.IsDone(), true, "there should have no pending mocks")
192
})
193
})
194
195
t.Run("googleSearchScan - /api/numbers/:number/scan/googlesearch", func(t *testing.T) {
196
t.Run("should return google search dorks", func(t *testing.T) {
197
res, err := performRequest(srv, http.MethodGet, "/api/numbers/330365179268/scan/googlesearch")
198
assert.NoError(t, err)
199
200
body, err := ioutil.ReadAll(res.Body)
201
assert.NoError(t, err)
202
203
assert.Equal(t, 200, res.Result().StatusCode)
204
assert.Equal(t, `{"success":true,"result":{"social_media":[{"number":"+33365179268","dork":"site:facebook.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Afacebook.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:twitter.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Atwitter.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:linkedin.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Alinkedin.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:instagram.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Ainstagram.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:vk.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Avk.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"}],"disposable_providers":[{"number":"+33365179268","dork":"site:hs3x.com intext:\"33365179268\"","url":"https://www.google.com/search?q=site%3Ahs3x.com+intext%3A%2233365179268%22"},{"number":"+33365179268","dork":"site:receive-sms-now.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceive-sms-now.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:smslisten.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asmslisten.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:smsnumbersonline.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asmsnumbersonline.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:freesmscode.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Afreesmscode.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:catchsms.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Acatchsms.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:smstibo.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asmstibo.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:smsreceiving.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asmsreceiving.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:getfreesmsnumber.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Agetfreesmsnumber.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:sellaite.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asellaite.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receive-sms-online.info intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceive-sms-online.info+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receivesmsonline.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceivesmsonline.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receive-a-sms.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceive-a-sms.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:sms-receive.net intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asms-receive.net+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receivefreesms.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceivefreesms.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receive-sms.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceive-sms.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receivetxt.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceivetxt.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:freephonenum.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Afreephonenum.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:freesmsverification.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Afreesmsverification.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:receive-sms-online.com intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Areceive-sms-online.com+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:smslive.co intext:\"33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Asmslive.co+intext%3A%2233365179268%22+%7C+intext%3A%220365179268%22"}],"reputation":[{"number":"+33365179268","dork":"site:whosenumber.info intext:\"+33365179268\" intitle:\"who called\"","url":"https://www.google.com/search?q=site%3Awhosenumber.info+intext%3A%22%2B33365179268%22+intitle%3A%22who+called%22"},{"number":"+33365179268","dork":"intitle:\"Phone Fraud\" intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=intitle%3A%22Phone+Fraud%22+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:findwhocallsme.com intext:\"+33365179268\" | intext:\"33365179268\"","url":"https://www.google.com/search?q=site%3Afindwhocallsme.com+intext%3A%22%2B33365179268%22+%7C+intext%3A%2233365179268%22"},{"number":"+33365179268","dork":"site:yellowpages.ca intext:\"+33365179268\"","url":"https://www.google.com/search?q=site%3Ayellowpages.ca+intext%3A%22%2B33365179268%22"},{"number":"+33365179268","dork":"site:phonenumbers.ie intext:\"+33365179268\"","url":"https://www.google.com/search?q=site%3Aphonenumbers.ie+intext%3A%22%2B33365179268%22"},{"number":"+33365179268","dork":"site:who-calledme.com intext:\"+33365179268\"","url":"https://www.google.com/search?q=site%3Awho-calledme.com+intext%3A%22%2B33365179268%22"},{"number":"+33365179268","dork":"site:usphonesearch.net intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Ausphonesearch.net+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:whocalled.us inurl:\"0365179268\"","url":"https://www.google.com/search?q=site%3Awhocalled.us+inurl%3A%220365179268%22"},{"number":"+33365179268","dork":"site:quinumero.info intext:\"0365179268\" | intext:\"33365179268\"","url":"https://www.google.com/search?q=site%3Aquinumero.info+intext%3A%220365179268%22+%7C+intext%3A%2233365179268%22"},{"number":"+33365179268","dork":"site:uk.popularphotolook.com inurl:\"0365179268\"","url":"https://www.google.com/search?q=site%3Auk.popularphotolook.com+inurl%3A%220365179268%22"}],"individuals":[{"number":"+33365179268","dork":"site:numinfo.net intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Anuminfo.net+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:sync.me intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Async.me+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:whocallsyou.de intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Awhocallsyou.de+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:pastebin.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Apastebin.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:whycall.me intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Awhycall.me+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:locatefamily.com intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Alocatefamily.com+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"},{"number":"+33365179268","dork":"site:spytox.com intext:\"0365179268\"","url":"https://www.google.com/search?q=site%3Aspytox.com+intext%3A%220365179268%22"}],"general":[{"number":"+33365179268","dork":"intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\" | intext:\"03 65 17 92 68\"","url":"https://www.google.com/search?q=intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22+%7C+intext%3A%2203+65+17+92+68%22"},{"number":"+33365179268","dork":"(ext:doc | ext:docx | ext:odt | ext:pdf | ext:rtf | ext:sxw | ext:psw | ext:ppt | ext:pptx | ext:pps | ext:csv | ext:txt | ext:xls) intext:\"33365179268\" | intext:\"+33365179268\" | intext:\"0365179268\"","url":"https://www.google.com/search?q=%28ext%3Adoc+%7C+ext%3Adocx+%7C+ext%3Aodt+%7C+ext%3Apdf+%7C+ext%3Artf+%7C+ext%3Asxw+%7C+ext%3Apsw+%7C+ext%3Appt+%7C+ext%3Apptx+%7C+ext%3Apps+%7C+ext%3Acsv+%7C+ext%3Atxt+%7C+ext%3Axls%29+intext%3A%2233365179268%22+%7C+intext%3A%22%2B33365179268%22+%7C+intext%3A%220365179268%22"}]}}`, string(body))
205
})
206
})
207
208
t.Run("ovhScan - /api/numbers/:number/scan/ovh", func(t *testing.T) {
209
t.Run("should find number on OVH", func(t *testing.T) {
210
defer gock.Off() // Flush pending mocks after test execution
211
212
gock.New("https://api.ovh.com").
213
Get("/1.0/telephony/number/detailedZones").
214
MatchParam("country", "fr").
215
Reply(200).
216
JSON([]suppliers.OVHAPIResponseNumber{
217
{
218
ZneList: []string{},
219
MatchingCriteria: "",
220
Prefix: 33,
221
InternationalNumber: "003336517xxxx",
222
Country: "fr",
223
ZipCode: "",
224
Number: "036517xxxx",
225
City: "Abbeville",
226
AskedCity: "",
227
},
228
})
229
230
res, err := performRequest(srv, http.MethodGet, "/api/numbers/330365179268/scan/ovh")
231
232
body, _ := ioutil.ReadAll(res.Body)
233
234
assert.Equal(t, err, nil)
235
assert.Equal(t, res.Result().StatusCode, 200)
236
assert.Equal(t, string(body), `{"success":true,"result":{"found":true,"number_range":"036517xxxx","city":"Abbeville"}}`)
237
238
assert.Equal(t, gock.IsDone(), true, "there should have no pending mocks")
239
})
240
})
241
242
t.Run("healthHandler - /api/", func(t *testing.T) {
243
res, err := performRequest(srv, http.MethodGet, "/api/")
244
assert.Equal(t, nil, err)
245
246
body, _ := ioutil.ReadAll(res.Body)
247
248
assert.Equal(t, 200, res.Result().StatusCode)
249
assert.Equal(t, `{"success":true,"version":"dev","commit":"dev","demo":false}`, string(body))
250
})
251
252
t.Run("404 error - /api/notfound", func(t *testing.T) {
253
res, err := performRequest(srv, http.MethodGet, "/api/notfound")
254
assert.Equal(t, err, nil)
255
256
body, _ := ioutil.ReadAll(res.Body)
257
258
assert.Equal(t, res.Result().StatusCode, 404)
259
assert.Equal(t, string(body), "{\"success\":false,\"error\":\"resource not found\"}")
260
})
261
262
t.Run("Client - /", func(t *testing.T) {
263
res, err := performRequest(srv, http.MethodGet, "/")
264
265
assert.Equal(t, nil, err)
266
assert.Equal(t, 200, res.Result().StatusCode)
267
assert.Equal(t, http.Header{"Content-Type": []string{"text/html; charset=utf-8"}}, res.Header())
268
})
269
})
270
}
271
272