|
1 | 1 | package cloudflare |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "net/http/httptest" |
| 5 | + "path/filepath" |
4 | 6 | "testing" |
5 | 7 | "time" |
6 | 8 |
|
7 | 9 | "github.com/go-acme/lego/v4/platform/tester" |
| 10 | + "github.com/go-acme/lego/v4/platform/tester/servermock" |
8 | 11 | "github.com/stretchr/testify/assert" |
9 | 12 | "github.com/stretchr/testify/require" |
10 | 13 | ) |
@@ -232,22 +235,17 @@ func TestNewDNSProviderConfig(t *testing.T) { |
232 | 235 | }, |
233 | 236 | { |
234 | 237 | desc: "missing credentials", |
235 | | - expected: "cloudflare: invalid credentials: key & email must not be empty", |
| 238 | + expected: "cloudflare: invalid credentials: authEmail, authKey or authToken must be set", |
236 | 239 | }, |
237 | 240 | { |
238 | 241 | desc: "missing email", |
239 | 242 | authKey: "123", |
240 | | - expected: "cloudflare: invalid credentials: key & email must not be empty", |
| 243 | + expected: "cloudflare: invalid credentials: authEmail and authKey must be set together", |
241 | 244 | }, |
242 | 245 | { |
243 | 246 | desc: "missing api key", |
244 | 247 | |
245 | | - expected: "cloudflare: invalid credentials: key & email must not be empty", |
246 | | - }, |
247 | | - { |
248 | | - desc: "missing api token, fallback to api key/email", |
249 | | - authToken: "", |
250 | | - expected: "cloudflare: invalid credentials: key & email must not be empty", |
| 248 | + expected: "cloudflare: invalid credentials: authEmail and authKey must be set together", |
251 | 249 | }, |
252 | 250 | } |
253 | 251 |
|
@@ -299,3 +297,68 @@ func TestLiveCleanUp(t *testing.T) { |
299 | 297 | err = provider.CleanUp(envTest.GetDomain(), "", "123d==") |
300 | 298 | require.NoError(t, err) |
301 | 299 | } |
| 300 | + |
| 301 | +func mockBuilder() *servermock.Builder[*DNSProvider] { |
| 302 | + return servermock.NewBuilder( |
| 303 | + func(server *httptest.Server) (*DNSProvider, error) { |
| 304 | + config := NewDefaultConfig() |
| 305 | + config. AuthEmail = "[email protected]" |
| 306 | + config.AuthKey = "secret" |
| 307 | + config.BaseURL = server.URL |
| 308 | + |
| 309 | + return NewDNSProviderConfig(config) |
| 310 | + }, |
| 311 | + servermock.CheckHeader(). |
| 312 | + WithRegexp("User-Agent", `goacme-lego/[0-9.]+ \(.+\)`). |
| 313 | + With( "X-Auth-Email", "[email protected]"). |
| 314 | + With("X-Auth-Key", "secret"), |
| 315 | + ) |
| 316 | +} |
| 317 | + |
| 318 | +func TestDNSProvider_Present(t *testing.T) { |
| 319 | + provider := mockBuilder(). |
| 320 | + // https://developers.cloudflare.com/api/resources/zones/methods/list/ |
| 321 | + Route("GET /zones", |
| 322 | + responseFromFixture("zones.json"), |
| 323 | + servermock.CheckQueryParameter().Strict(). |
| 324 | + With("name", "example.com"). |
| 325 | + With("per_page", "50")). |
| 326 | + // https://developers.cloudflare.com/api/resources/dns/subresources/records/methods/create/ |
| 327 | + Route("POST /zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records", |
| 328 | + responseFromFixture("create_record.json"), |
| 329 | + servermock.CheckHeader(). |
| 330 | + WithContentType("application/json"), |
| 331 | + servermock.CheckRequestJSONBodyFromFile("create_record-request.json"). |
| 332 | + WithDirectory(filepath.Join("internal", "fixtures"))). |
| 333 | + Build(t) |
| 334 | + |
| 335 | + err := provider.Present("example.com", "abc", "123d==") |
| 336 | + require.NoError(t, err) |
| 337 | +} |
| 338 | + |
| 339 | +func TestDNSProvider_CleanUp(t *testing.T) { |
| 340 | + provider := mockBuilder(). |
| 341 | + // https://developers.cloudflare.com/api/resources/zones/methods/list/ |
| 342 | + Route("GET /zones", |
| 343 | + responseFromFixture("zones.json"), |
| 344 | + servermock.CheckQueryParameter().Strict(). |
| 345 | + With("name", "example.com"). |
| 346 | + With("per_page", "50")). |
| 347 | + // https://developers.cloudflare.com/api/resources/dns/subresources/records/methods/delete/ |
| 348 | + Route("DELETE /zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/xxx", |
| 349 | + responseFromFixture("delete_record.json")). |
| 350 | + Build(t) |
| 351 | + |
| 352 | + token := "abc" |
| 353 | + |
| 354 | + provider.recordIDsMu.Lock() |
| 355 | + provider.recordIDs["abc"] = "xxx" |
| 356 | + provider.recordIDsMu.Unlock() |
| 357 | + |
| 358 | + err := provider.CleanUp("example.com", token, "123d==") |
| 359 | + require.NoError(t, err) |
| 360 | +} |
| 361 | + |
| 362 | +func responseFromFixture(filename string) *servermock.ResponseFromFileHandler { |
| 363 | + return servermock.ResponseFromFile(filepath.Join("internal", "fixtures", filename)) |
| 364 | +} |
0 commit comments