Path: blob/master/web/v2/api/handlers/scanners_test.go
994 views
package handlers_test12import (3"bytes"4"encoding/json"5"errors"6"fmt"7"github.com/stretchr/testify/assert"8"github.com/sundowndev/phoneinfoga/v2/lib/filter"9"github.com/sundowndev/phoneinfoga/v2/lib/remote"10"github.com/sundowndev/phoneinfoga/v2/mocks"11"github.com/sundowndev/phoneinfoga/v2/test"12"github.com/sundowndev/phoneinfoga/v2/web/v2/api"13"github.com/sundowndev/phoneinfoga/v2/web/v2/api/handlers"14"github.com/sundowndev/phoneinfoga/v2/web/v2/api/server"15"net/http"16"net/http/httptest"17"testing"18)1920func TestGetAllScanners(t *testing.T) {21type expectedResponse struct {22Code int23Body interface{}24}2526testcases := []struct {27Name string28Expected expectedResponse29}{30{31Name: "test getting all scanners",32Expected: expectedResponse{33Code: 200,34Body: handlers.GetAllScannersResponse{35Scanners: []handlers.Scanner{36{37Name: "fakeScanner",38Description: "fakeScanner description",39},40},41},42},43},44}4546for _, tt := range testcases {47t.Run(tt.Name, func(t *testing.T) {48fakeScanner := &mocks.Scanner{}49fakeScanner.On("Name").Return("fakeScanner")50fakeScanner.On("Description").Return("fakeScanner description")51handlers.RemoteLibrary = remote.NewLibrary(filter.NewEngine())52handlers.RemoteLibrary.AddScanner(fakeScanner)5354r := server.NewServer()5556req, err := http.NewRequest(http.MethodGet, "/v2/scanners", nil)57if err != nil {58t.Fatal(err)59}60w := httptest.NewRecorder()61r.ServeHTTP(w, req)6263b, err := json.Marshal(tt.Expected.Body)64if err != nil {65t.Fatal(err)66}6768assert.Equal(t, tt.Expected.Code, w.Code)69assert.Equal(t, string(b), w.Body.String())70fakeScanner.AssertExpectations(t)71})72}73}7475func TestDryRunScanner(t *testing.T) {76type expectedResponse struct {77Code int78Body interface{}79}8081type params struct {82Supplier string83}8485testcases := []struct {86Name string87Params params88Body interface{}89Expected expectedResponse90Mocks func(*mocks.Scanner)91}{92{93Name: "test dry running scanner",94Params: params{Supplier: "fakeScanner"},95Body: handlers.DryRunScannerInput{Number: "14152229670"},96Expected: expectedResponse{97Code: 200,98Body: handlers.DryRunScannerResponse{Success: true},99},100Mocks: func(s *mocks.Scanner) {101s.On("Name").Return("fakeScanner")102s.On("DryRun", *test.NewFakeUSNumber(), remote.ScannerOptions{}).Return(nil)103},104},105{106Name: "test dry running scanner with options",107Params: params{Supplier: "fakeScanner"},108Body: handlers.DryRunScannerInput{109Number: "14152229670",110Options: remote.ScannerOptions{"api_key": "secret"},111},112Expected: expectedResponse{113Code: 200,114Body: handlers.DryRunScannerResponse{Success: true},115},116Mocks: func(s *mocks.Scanner) {117s.On("Name").Return("fakeScanner")118s.On("DryRun", *test.NewFakeUSNumber(), remote.ScannerOptions{"api_key": "secret"}).Return(nil)119},120},121{122Name: "test dry running scanner with empty options",123Params: params{Supplier: "fakeScanner"},124Body: handlers.DryRunScannerInput{125Number: "14152229670",126Options: remote.ScannerOptions{},127},128Expected: expectedResponse{129Code: 200,130Body: handlers.DryRunScannerResponse{Success: true},131},132Mocks: func(s *mocks.Scanner) {133s.On("Name").Return("fakeScanner")134s.On("DryRun", *test.NewFakeUSNumber(), remote.ScannerOptions{}).Return(nil)135},136},137{138Name: "test dry running scanner with error",139Params: params{Supplier: "fakeScanner"},140Body: handlers.DryRunScannerInput{Number: "14152229670"},141Expected: expectedResponse{142Code: 400,143Body: handlers.DryRunScannerResponse{Success: false, Error: "dummy error"},144},145Mocks: func(s *mocks.Scanner) {146s.On("Name").Return("fakeScanner")147s.On("DryRun", *test.NewFakeUSNumber(), make(remote.ScannerOptions)).Return(errors.New("dummy error"))148},149},150{151Name: "test invalid number",152Params: params{Supplier: "fakeScanner"},153Body: handlers.DryRunScannerInput{Number: "1.4152229670"},154Expected: expectedResponse{155Code: 400,156Body: api.ErrorResponse{Error: "Invalid phone number: please provide an integer without any special chars"},157},158Mocks: func(s *mocks.Scanner) {159s.On("Name").Return("fakeScanner")160},161},162{163Name: "test scanner not found",164Params: params{Supplier: "test"},165Body: handlers.DryRunScannerInput{Number: "14152229670"},166Expected: expectedResponse{167Code: 404,168Body: api.ErrorResponse{Error: "Scanner not found"},169},170Mocks: func(s *mocks.Scanner) {171s.On("Name").Return("fakeScanner")172},173},174{175Name: "test invalid number",176Params: params{Supplier: "fakeScanner"},177Body: handlers.DryRunScannerInput{Number: "222"},178Expected: expectedResponse{179Code: 400,180Body: api.ErrorResponse{Error: "the string supplied is too short to be a phone number"},181},182Mocks: func(s *mocks.Scanner) {183s.On("Name").Return("fakeScanner")184},185},186}187188for _, tt := range testcases {189t.Run(tt.Name, func(t *testing.T) {190fakeScanner := &mocks.Scanner{}191tt.Mocks(fakeScanner)192handlers.RemoteLibrary = remote.NewLibrary(filter.NewEngine())193handlers.RemoteLibrary.AddScanner(fakeScanner)194195data, err := json.Marshal(&tt.Body)196if err != nil {197t.Fatal(err)198}199200req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("/v2/scanners/%s/dryrun", tt.Params.Supplier), bytes.NewReader(data))201if err != nil {202t.Fatal(err)203}204w := httptest.NewRecorder()205server.NewServer().ServeHTTP(w, req)206207b, err := json.Marshal(tt.Expected.Body)208if err != nil {209t.Fatal(err)210}211212assert.Equal(t, tt.Expected.Code, w.Code)213assert.Equal(t, string(b), w.Body.String())214fakeScanner.AssertExpectations(t)215})216}217}218219func TestRunScanner(t *testing.T) {220type FakeScannerResponse struct {221Info string `json:"info"`222}223224type expectedResponse struct {225Code int226Body interface{}227}228229type params struct {230Supplier string231}232233testcases := []struct {234Name string235Params params236Body interface{}237Expected expectedResponse238Mocks func(*mocks.Scanner)239}{240{241Name: "test running scanner",242Params: params{Supplier: "fakeScanner"},243Body: handlers.RunScannerInput{Number: "14152229670"},244Expected: expectedResponse{245Code: 200,246Body: handlers.RunScannerResponse{247Result: FakeScannerResponse{Info: "test"},248},249},250Mocks: func(s *mocks.Scanner) {251s.On("Name").Return("fakeScanner")252s.On("Run", *test.NewFakeUSNumber(), remote.ScannerOptions{}).Return(FakeScannerResponse{Info: "test"}, nil)253},254},255{256Name: "test running scanner with error",257Params: params{Supplier: "fakeScanner"},258Body: handlers.RunScannerInput{Number: "14152229670"},259Expected: expectedResponse{260Code: 500,261Body: api.ErrorResponse{Error: "dummy error"},262},263Mocks: func(s *mocks.Scanner) {264s.On("Name").Return("fakeScanner")265s.On("Run", *test.NewFakeUSNumber(), remote.ScannerOptions{}).Return(nil, errors.New("dummy error"))266},267},268{269Name: "test invalid number",270Params: params{Supplier: "fakeScanner"},271Body: handlers.RunScannerInput{Number: "1.4152229670"},272Expected: expectedResponse{273Code: 400,274Body: api.ErrorResponse{Error: "Invalid phone number: please provide an integer without any special chars"},275},276Mocks: func(s *mocks.Scanner) {277s.On("Name").Return("fakeScanner")278},279},280{281Name: "test scanner not found",282Params: params{Supplier: "test"},283Body: handlers.RunScannerInput{Number: "14152229670"},284Expected: expectedResponse{285Code: 404,286Body: api.ErrorResponse{Error: "Scanner not found"},287},288Mocks: func(s *mocks.Scanner) {289s.On("Name").Return("fakeScanner")290},291},292{293Name: "test invalid number",294Params: params{Supplier: "fakeScanner"},295Body: handlers.RunScannerInput{Number: "222"},296Expected: expectedResponse{297Code: 400,298Body: api.ErrorResponse{Error: "the string supplied is too short to be a phone number"},299},300Mocks: func(s *mocks.Scanner) {301s.On("Name").Return("fakeScanner")302},303},304}305306for _, tt := range testcases {307t.Run(tt.Name, func(t *testing.T) {308fakeScanner := &mocks.Scanner{}309tt.Mocks(fakeScanner)310handlers.RemoteLibrary = remote.NewLibrary(filter.NewEngine())311handlers.RemoteLibrary.AddScanner(fakeScanner)312313data, err := json.Marshal(&tt.Body)314if err != nil {315t.Fatal(err)316}317318req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("/v2/scanners/%s/run", tt.Params.Supplier), bytes.NewReader(data))319if err != nil {320t.Fatal(err)321}322w := httptest.NewRecorder()323server.NewServer().ServeHTTP(w, req)324325b, err := json.Marshal(tt.Expected.Body)326if err != nil {327t.Fatal(err)328}329330assert.Equal(t, tt.Expected.Code, w.Code)331assert.Equal(t, string(b), w.Body.String())332fakeScanner.AssertExpectations(t)333})334}335}336337338