@@ -92,6 +92,12 @@ func newTestServerV6(t *testing.T, hdlr http.HandlerFunc) *httptest.Server {
9292 return svr
9393}
9494
95+ type errorTransportV6 struct {}
96+
97+ func (t * errorTransportV6 ) RoundTrip (req * http.Request ) (* http.Response , error ) {
98+ return nil , errors .New ("network error" )
99+ }
100+
95101func TestNewPiholeClientV6 (t * testing.T ) {
96102 // Test correct error on no server provided
97103 _ , err := newPiholeClientV6 (PiholeConfig {APIVersion : "6" })
@@ -117,15 +123,18 @@ func TestNewPiholeClientV6(t *testing.T) {
117123 srvr := newTestServerV6 (t , func (w http.ResponseWriter , r * http.Request ) {
118124 if r .URL .Path == "/api/auth" && r .Method == http .MethodPost {
119125 var requestData map [string ]string
120- json .NewDecoder (r .Body ).Decode (& requestData )
126+ err := json .NewDecoder (r .Body ).Decode (& requestData )
127+ if err != nil {
128+ t .Fatal (err )
129+ }
121130 defer r .Body .Close ()
122131
123132 w .Header ().Set ("Content-Type" , "application/json" )
124133
125134 if requestData ["password" ] != "correct" {
126135 // Return unsuccessful authentication response
127136 w .WriteHeader (http .StatusUnauthorized )
128- w .Write ([]byte (`{
137+ _ , err = w .Write ([]byte (`{
129138 "session": {
130139 "valid": false,
131140 "totp": false,
@@ -135,11 +144,14 @@ func TestNewPiholeClientV6(t *testing.T) {
135144 },
136145 "took": 0.2
137146 }` ))
147+ if err != nil {
148+ t .Fatal (err )
149+ }
138150 return
139151 }
140152
141153 // Return successful authentication response
142- w .Write ([]byte (`{
154+ _ , err = w .Write ([]byte (`{
143155 "session": {
144156 "valid": true,
145157 "totp": false,
@@ -185,7 +197,7 @@ func TestListRecordsV6(t *testing.T) {
185197 w .Header ().Set ("Content-Type" , "application/json" )
186198
187199 // Return A records
188- w .Write ([]byte (`{
200+ if _ , err := w .Write ([]byte (`{
189201 "config": {
190202 "dns": {
191203 "hosts": [
@@ -205,7 +217,9 @@ func TestListRecordsV6(t *testing.T) {
205217 }
206218 },
207219 "took": 5
208- }` ))
220+ }` )); err != nil {
221+ t .Fatal (err )
222+ }
209223 } else if r .URL .Path == "/api/config/dns/cnameRecords" && r .Method == http .MethodGet {
210224
211225 w .WriteHeader (http .StatusOK )
@@ -384,9 +398,12 @@ func TestErrorsV6(t *testing.T) {
384398 Server : "not an url" ,
385399 APIVersion : "6" ,
386400 }
387- clErrURL , _ := newPiholeClientV6 (cfgErrURL )
401+ clErrURL , err := newPiholeClientV6 (cfgErrURL )
402+ if err != nil {
403+ t .Fatal (err )
404+ }
388405
389- _ , err : = clErrURL .listRecords (context .Background (), endpoint .RecordTypeCNAME )
406+ _ , err = clErrURL .listRecords (context .Background (), endpoint .RecordTypeCNAME )
390407 if err == nil {
391408 t .Fatal ("Expected error for using invalid URL" )
392409 }
@@ -785,6 +802,80 @@ func TestDoRetryOne(t *testing.T) {
785802
786803}
787804
805+ func TestDoV6AdditionalCases (t * testing.T ) {
806+ t .Run ("http client error" , func (t * testing.T ) {
807+ client := & piholeClientV6 {
808+ httpClient : & http.Client {
809+ Transport : & errorTransportV6 {},
810+ },
811+ }
812+ req , _ := http .NewRequest (http .MethodGet , "http://localhost" , nil )
813+ _ , err := client .do (req )
814+ if err == nil {
815+ t .Fatal ("expected an error, but got none" )
816+ }
817+ if ! strings .Contains (err .Error (), "network error" ) {
818+ t .Fatalf ("expected error to contain 'network error', but got '%v'" , err )
819+ }
820+ })
821+
822+ t .Run ("item already present" , func (t * testing.T ) {
823+ server := newTestServerV6 (t , func (w http.ResponseWriter , r * http.Request ) {
824+ w .WriteHeader (http .StatusBadRequest )
825+ w .Write ([]byte (`{
826+ "error": {
827+ "key": "bad_request",
828+ "message": "Item already present",
829+ "hint": "The item you're trying to add already exists"
830+ },
831+ "took": 0.1
832+ }` ))
833+ })
834+ defer server .Close ()
835+
836+ client := & piholeClientV6 {
837+ httpClient : server .Client (),
838+ token : "test-token" ,
839+ }
840+ req , _ := http .NewRequest (http .MethodPut , server .URL + "/api/test" , nil )
841+ resp , err := client .do (req )
842+ if err != nil {
843+ t .Fatalf ("expected no error for 'Item already present', but got '%v'" , err )
844+ }
845+ if resp == nil {
846+ t .Fatal ("expected response, but got nil" )
847+ }
848+ })
849+
850+ t .Run ("404 on DELETE" , func (t * testing.T ) {
851+ server := newTestServerV6 (t , func (w http.ResponseWriter , r * http.Request ) {
852+ w .WriteHeader (http .StatusNotFound )
853+ w .Write ([]byte (`{
854+ "error": {
855+ "key": "not_found",
856+ "message": "Item not found",
857+ "hint": "The item you're trying to delete does not exist"
858+ },
859+ "took": 0.1
860+ }` ))
861+ })
862+ defer server .Close ()
863+
864+ client := & piholeClientV6 {
865+ httpClient : server .Client (),
866+ token : "test-token" ,
867+ }
868+ req , _ := http .NewRequest (http .MethodDelete , server .URL + "/api/test" , nil )
869+ resp , err := client .do (req )
870+ if err != nil {
871+ t .Fatalf ("expected no error for 404 on DELETE, but got '%v'" , err )
872+ }
873+ if resp == nil {
874+ t .Fatal ("expected response, but got nil" )
875+ }
876+ })
877+ }
878+
788879func TestCreateRecordV6 (t * testing.T ) {
789880 var ep * endpoint.Endpoint
790881 srvr := newTestServerV6 (t , func (w http.ResponseWriter , r * http.Request ) {
0 commit comments