* ddns: store configuation in database Co-authored-by: nap0o <144927971+nap0o@users.noreply.github.com> * feat: split domain with soa lookup * switch to libdns interface * ddns: add unit test * ddns: skip TestSplitDomainSOA on ci network is not steady * fix error handling * fix error handling --------- Co-authored-by: nap0o <144927971+nap0o@users.noreply.github.com>
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package webhook
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/naiba/nezha/model"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	reqTypeForm = "application/x-www-form-urlencoded"
 | 
						|
	reqTypeJSON = "application/json"
 | 
						|
)
 | 
						|
 | 
						|
type testSt struct {
 | 
						|
	profile           model.DDNSProfile
 | 
						|
	expectURL         string
 | 
						|
	expectBody        string
 | 
						|
	expectContentType string
 | 
						|
	expectHeader      map[string]string
 | 
						|
}
 | 
						|
 | 
						|
func execCase(t *testing.T, item testSt) {
 | 
						|
	pw := Provider{DDNSProfile: &item.profile}
 | 
						|
	pw.ipAddr = "1.1.1.1"
 | 
						|
	pw.domain = item.profile.Domains[0]
 | 
						|
	pw.ipType = "ipv4"
 | 
						|
	pw.recordType = "A"
 | 
						|
	pw.DDNSProfile = &item.profile
 | 
						|
 | 
						|
	reqUrl, err := pw.reqUrl()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("Error: %s", err)
 | 
						|
	}
 | 
						|
	if item.expectURL != reqUrl.String() {
 | 
						|
		t.Fatalf("Expected %s, but got %s", item.expectURL, reqUrl.String())
 | 
						|
	}
 | 
						|
 | 
						|
	reqBody, err := pw.reqBody()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("Error: %s", err)
 | 
						|
	}
 | 
						|
	if item.expectBody != reqBody {
 | 
						|
		t.Fatalf("Expected %s, but got %s", item.expectBody, reqBody)
 | 
						|
	}
 | 
						|
 | 
						|
	req, err := pw.prepareRequest(context.Background())
 | 
						|
	if err != nil {
 | 
						|
		t.Fatalf("Error: %s", err)
 | 
						|
	}
 | 
						|
 | 
						|
	if item.expectContentType != req.Header.Get("Content-Type") {
 | 
						|
		t.Fatalf("Expected %s, but got %s", item.expectContentType, req.Header.Get("Content-Type"))
 | 
						|
	}
 | 
						|
 | 
						|
	for k, v := range item.expectHeader {
 | 
						|
		if v != req.Header.Get(k) {
 | 
						|
			t.Fatalf("Expected %s, but got %s", v, req.Header.Get(k))
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestWebhookRequest(t *testing.T) {
 | 
						|
	ipv4 := true
 | 
						|
 | 
						|
	cases := []testSt{
 | 
						|
		{
 | 
						|
			profile: model.DDNSProfile{
 | 
						|
				Domains:        []string{"www.example.com"},
 | 
						|
				MaxRetries:     1,
 | 
						|
				EnableIPv4:     &ipv4,
 | 
						|
				WebhookURL:     "http://ddns.example.com/?ip=#ip#",
 | 
						|
				WebhookMethod:  methodGET,
 | 
						|
				WebhookHeaders: `{"ip":"#ip#","record":"#record#"}`,
 | 
						|
			},
 | 
						|
			expectURL:         "http://ddns.example.com/?ip=1.1.1.1",
 | 
						|
			expectContentType: "",
 | 
						|
			expectHeader: map[string]string{
 | 
						|
				"ip":     "1.1.1.1",
 | 
						|
				"record": "A",
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			profile: model.DDNSProfile{
 | 
						|
				Domains:            []string{"www.example.com"},
 | 
						|
				MaxRetries:         1,
 | 
						|
				EnableIPv4:         &ipv4,
 | 
						|
				WebhookURL:         "http://ddns.example.com/api",
 | 
						|
				WebhookMethod:      methodPOST,
 | 
						|
				WebhookRequestType: requestTypeJSON,
 | 
						|
				WebhookRequestBody: `{"ip":"#ip#","record":"#record#"}`,
 | 
						|
			},
 | 
						|
			expectURL:         "http://ddns.example.com/api",
 | 
						|
			expectContentType: reqTypeJSON,
 | 
						|
			expectBody:        `{"ip":"1.1.1.1","record":"A"}`,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			profile: model.DDNSProfile{
 | 
						|
				Domains:            []string{"www.example.com"},
 | 
						|
				MaxRetries:         1,
 | 
						|
				EnableIPv4:         &ipv4,
 | 
						|
				WebhookURL:         "http://ddns.example.com/api",
 | 
						|
				WebhookMethod:      methodPOST,
 | 
						|
				WebhookRequestType: requestTypeForm,
 | 
						|
				WebhookRequestBody: `{"ip":"#ip#","record":"#record#"}`,
 | 
						|
			},
 | 
						|
			expectURL:         "http://ddns.example.com/api",
 | 
						|
			expectContentType: reqTypeForm,
 | 
						|
			expectBody:        "ip=1.1.1.1&record=A",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, c := range cases {
 | 
						|
		execCase(t, c)
 | 
						|
	}
 | 
						|
}
 |