From f75b83f1713a7c7aacfcdd8a4134a9113981d136 Mon Sep 17 00:00:00 2001 From: Rodrigo Coutinho Date: Fri, 29 Dec 2017 18:32:36 -0200 Subject: Fix test suite (#11) * Fix broken specs and update exvcr * Provide default configuration to run tests * Show nameservers in zone --- config/config.exs | 28 +------ config/dev.exs | 1 + config/prod.exs | 1 + config/test.exs | 4 + lib/powerdnsex/managers/records_manager.ex | 12 +-- lib/powerdnsex/managers/zones_manager.ex | 5 +- lib/powerdnsex/models/resource_record_set.ex | 8 ++ mix.exs | 4 +- mix.lock | 27 +++---- test/lib/powerdnsex/config_test.exs | 28 +++---- .../powerdnsex/managers/records_manager_test.exs | 53 +++++-------- .../lib/powerdnsex/managers/zones_manager_test.exs | 37 ++++++--- .../powerdnsex/models/resource_record_set_test.exs | 89 ++++++++++++++++++++++ .../cassettes/zones_manager/show/success.json | 2 +- test/support/fake_config.exs | 4 +- 15 files changed, 190 insertions(+), 113 deletions(-) create mode 100644 config/dev.exs create mode 100644 config/prod.exs create mode 100644 config/test.exs create mode 100644 test/lib/powerdnsex/models/resource_record_set_test.exs diff --git a/config/config.exs b/config/config.exs index 4f2b23f..8eff0b9 100644 --- a/config/config.exs +++ b/config/config.exs @@ -1,30 +1,4 @@ -# This file is responsible for configuring your application -# and its dependencies with the aid of the Mix.Config module. use Mix.Config -# This configuration is loaded before any dependency and is restricted -# to this project. If another project depends on this project, this -# file won't be loaded nor affect the parent project. For this reason, -# if you want to provide default values for your application for -# 3rd-party users, it should be done in your "mix.exs" file. +import_config "#{Mix.env}.exs" -# You can configure for your application as: -# -# config :powerdnsex, key: :value -# -# And access this configuration in your application as: -# -# Application.get_env(:powerdnsex, :key) -# -# Or configure a 3rd-party app: -# -# config :logger, level: :info -# - -# It is also possible to import configuration files, relative to this -# directory. For example, you can emulate configuration per environment -# by uncommenting the line below and defining dev.exs, test.exs and such. -# Configuration from the imported file will override the ones defined -# here (which is why it is important to import them last). -# -# import_config "#{Mix.env}.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/dev.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..d2d855e --- /dev/null +++ b/config/prod.exs @@ -0,0 +1 @@ +use Mix.Config diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..eedc0c7 --- /dev/null +++ b/config/test.exs @@ -0,0 +1,4 @@ +use Mix.Config + +config :powerdnsex, url: "https://powerdns.example.com" +config :powerdnsex, token: "example" diff --git a/lib/powerdnsex/managers/records_manager.ex b/lib/powerdnsex/managers/records_manager.ex index c5dd051..9b6a96f 100644 --- a/lib/powerdnsex/managers/records_manager.ex +++ b/lib/powerdnsex/managers/records_manager.ex @@ -2,7 +2,7 @@ defmodule PowerDNSex.Managers.RecordsManager do require Logger alias PowerDNSex.HttpClient - alias PowerDNSex.Models.{Zone, Record, Error} + alias PowerDNSex.Models.{Zone, Error} alias PowerDNSex.Models.ResourceRecordSet, as: RRSet alias PowerDNSex.Managers.ZonesManager alias HTTPoison.Response @@ -29,7 +29,7 @@ defmodule PowerDNSex.Managers.RecordsManager do updated_rrset = Map.merge(updated_rrset, %{changetype: "REPLACE"}) patch(zone, updated_rrset) else - error_msg = "Record #{rrset_name}, type #{rrset_type}, not found!" + error_msg = "Record #{rrset_find_params.name}, type #{rrset_type}, not found!" {:error, %Error{error: error_msg, http_status_code: 404}} end end @@ -41,7 +41,7 @@ defmodule PowerDNSex.Managers.RecordsManager do ### # Private - ## + ### defp process_request_response(%Response{body: body, status_code: status}) do case status do @@ -70,10 +70,4 @@ defmodule PowerDNSex.Managers.RecordsManager do defp patch(%Zone{} = zone, %{} = rrset_attrs) do patch(zone, RRSet.build(rrset_attrs)) end - - defp has_attrs?(rrset, attrs) do - attrs - |> Map.keys - |> Enum.all?(&(equal_attr?(&1, attrs[&1], rrsets))) - end end diff --git a/lib/powerdnsex/managers/zones_manager.ex b/lib/powerdnsex/managers/zones_manager.ex index 0430223..c7ec1ab 100644 --- a/lib/powerdnsex/managers/zones_manager.ex +++ b/lib/powerdnsex/managers/zones_manager.ex @@ -56,8 +56,11 @@ defmodule PowerDNSex.Managers.ZonesManager do end defp decode_body(body) do - body + zone = body |> Poison.decode!(as: %Zone{rrsets: [%ResourceRecordSet{records: [%Record{}]}]}) + + nameservers = ResourceRecordSet.nameservers(zone.rrsets) + Map.put(zone, :nameservers, nameservers) end end diff --git a/lib/powerdnsex/models/resource_record_set.ex b/lib/powerdnsex/models/resource_record_set.ex index c0845d9..1a410b1 100644 --- a/lib/powerdnsex/models/resource_record_set.ex +++ b/lib/powerdnsex/models/resource_record_set.ex @@ -47,6 +47,14 @@ defmodule PowerDNSex.Models.ResourceRecordSet do end) end + def nameservers(rrsets) do + rrset = Enum.find(rrsets, fn(rrset) -> rrset.type == "NS" end) + nameservers = case rrset do + nil -> [] + _ -> Enum.map(rrset.records, &(&1.content) ) + end + end + ### # Private ### diff --git a/mix.exs b/mix.exs index 6fd5396..b102ccd 100644 --- a/mix.exs +++ b/mix.exs @@ -17,9 +17,9 @@ defmodule PowerDNSex.Mixfile do end defp deps do - [{:httpoison, "~> 0.9.0"}, + [{:httpoison, "~> 0.13.0"}, {:poison, "~> 2.2"}, - {:exvcr, "~> 0.8.0", only: :test}] + {:exvcr, "~> 0.9.1", only: :test}] end defp description do diff --git a/mix.lock b/mix.lock index 328bf04..4d9c60a 100644 --- a/mix.lock +++ b/mix.lock @@ -1,13 +1,14 @@ -%{"certifi": {:hex, :certifi, "0.4.0", "a7966efb868b179023618d29a407548f70c52466bf1849b9e8ebd0e34b7ea11f", [:rebar3], []}, - "exactor": {:hex, :exactor, "2.2.0", "2a7418b82d974fe8276edd62c1facf4a9dc06339cdf11b5dcd10359e107fe5c3", [:mix], []}, - "exjsx": {:hex, :exjsx, "3.2.0", "7136cc739ace295fc74c378f33699e5145bead4fdc1b4799822d0287489136fb", [:mix], [{:jsx, "~> 2.6.2", [hex: :jsx, optional: false]}]}, - "exvcr": {:hex, :exvcr, "0.8.0", "61b8da4723150938f612af8a2f885709af7e486e4deac4b454a161de3430e699", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, optional: false]}, {:exjsx, "~> 3.2", [hex: :exjsx, optional: false]}, {:httpoison, "~> 0.8", [hex: :httpoison, optional: true]}, {:httpotion, "~> 3.0", [hex: :httpotion, optional: true]}, {:ibrowse, "~> 4.2.2", [hex: :ibrowse, optional: true]}, {:meck, "~> 0.8.3", [hex: :meck, optional: false]}]}, - "hackney": {:hex, :hackney, "1.6.0", "8d1e9440c9edf23bf5e5e2fe0c71de03eb265103b72901337394c840eec679ac", [:rebar3], [{:certifi, "0.4.0", [hex: :certifi, optional: false]}, {:idna, "1.2.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.0", [hex: :ssl_verify_fun, optional: false]}]}, - "httpoison": {:hex, :httpoison, "0.9.0", "68187a2daddfabbe7ca8f7d75ef227f89f0e1507f7eecb67e4536b3c516faddb", [:mix], [{:hackney, "~> 1.6.0", [hex: :hackney, optional: false]}]}, - "idna": {:hex, :idna, "1.2.0", "ac62ee99da068f43c50dc69acf700e03a62a348360126260e87f2b54eced86b2", [:rebar3], []}, - "jsx": {:hex, :jsx, "2.6.2", "213721e058da0587a4bce3cc8a00ff6684ced229c8f9223245c6ff2c88fbaa5a", [:mix, :rebar], []}, - "meck": {:hex, :meck, "0.8.4", "59ca1cd971372aa223138efcf9b29475bde299e1953046a0c727184790ab1520", [:rebar, :make], []}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []}, - "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []}, - "poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], []}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.0", "edee20847c42e379bf91261db474ffbe373f8acb56e9079acb6038d4e0bf414f", [:rebar, :make], []}} +%{"certifi": {:hex, :certifi, "2.0.0", "a0c0e475107135f76b8c1d5bc7efb33cd3815cb3cf3dea7aefdd174dabead064", [:rebar3], [], "hexpm"}, + "exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm"}, + "exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm"}, + "exvcr": {:hex, :exvcr, "0.9.1", "31e3936a790a14bf56b31b6b276577076a5ef8afd9b2d53ba3ff8bb647d45613", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 0.13", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.0", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"}, + "hackney": {:hex, :hackney, "1.10.1", "c38d0ca52ea80254936a32c45bb7eb414e7a96a521b4ce76d00a69753b157f21", [:rebar3], [{:certifi, "2.0.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "httpoison": {:hex, :httpoison, "0.13.0", "bfaf44d9f133a6599886720f3937a7699466d23bb0cd7a88b6ba011f53c6f562", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "5.1.0", "d72b4effeb324ad5da3cab1767cb16b17939004e789d8c0ad5b70f3cea20c89a", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm"}, + "meck": {:hex, :meck, "0.8.9", "64c5c0bd8bcca3a180b44196265c8ed7594e16bcc845d0698ec6b4e577f48188", [:rebar3], [], "hexpm"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"}, + "poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], [], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"}} diff --git a/test/lib/powerdnsex/config_test.exs b/test/lib/powerdnsex/config_test.exs index c0a5150..079b127 100644 --- a/test/lib/powerdnsex/config_test.exs +++ b/test/lib/powerdnsex/config_test.exs @@ -4,27 +4,27 @@ defmodule PowerDNSex.ConfigTest do alias PowerDNSex.FakeConfig, as: Config - setup with_valid_url, do: Config.set_url - setup with_valid_token, do: Config.set_token - setup with_valid_token_and_url, do: Config.set_url && Config.set_token + setup do: Config.set_url + setup do: Config.set_token + setup do: Config.set_url && Config.set_token describe "Config.powerdns_token/0" do @tag :configs - test "Using Env vars", with_valid_url do - env_token = "S3cr37_70k3n" + test "Using Env vars" do + env_token = "new-token" System.put_env("POWERDNS_TOKEN", env_token) - Application.put_env(:powerdns, :token, {:system, "POWERDNS_TOKEN"}) + Application.put_env(:powerdnsex, :token, {:system, "POWERDNS_TOKEN"}) assert PowerDNSex.Config.powerdns_token == env_token end @tag :configs - test "using application config", with_valid_token_and_url do + test "using application config" do assert PowerDNSex.Config.powerdns_token == Config.token end @tag :configs - test "given none token config", with_valid_url do - Application.delete_env(:powerdns, :token) + test "given none token config" do + Application.delete_env(:powerdnsex, :token) expected_error = "[PowerDNSex] PowerDNS token not configured." assert_raise RuntimeError, expected_error, fn -> @@ -35,21 +35,21 @@ defmodule PowerDNSex.ConfigTest do describe "Config.powerdns_url/0" do @tag :configs - test "Using Env vars", with_valid_token do + test "Using Env vars" do env_url = "https://env-powerdns.test/" System.put_env("POWERDNS_URL", env_url) - Application.put_env(:powerdns, :url, {:system, "POWERDNS_URL"}) + Application.put_env(:powerdnsex, :url, {:system, "POWERDNS_URL"}) assert PowerDNSex.Config.powerdns_url == env_url end @tag :configs - test "using application config", with_valid_token_and_url do + test "using application config" do assert PowerDNSex.Config.powerdns_url == Config.url <> "/" end @tag :configs - test "given none url config", with_valid_token do - Application.delete_env(:powerdns, :url) + test "given none url config" do + Application.delete_env(:powerdnsex, :url) expected_error = "[PowerDNSex] PowerDNS url not configured." assert_raise RuntimeError, expected_error, fn -> PowerDNSex.Config.powerdns_url diff --git a/test/lib/powerdnsex/managers/records_manager_test.exs b/test/lib/powerdnsex/managers/records_manager_test.exs index 6580bd3..4c83b40 100644 --- a/test/lib/powerdnsex/managers/records_manager_test.exs +++ b/test/lib/powerdnsex/managers/records_manager_test.exs @@ -6,9 +6,21 @@ defmodule PowerDNSex.Managers.RecordsManagerTest do alias PowerDNSex.Models.{Zone, Record} alias PowerDNSex.Managers.RecordsManager alias PowerDNSex.FakeConfig, as: Config + alias PowerDNSex.Models.ResourceRecordSet, as: RRSet + + @record %RRSet{ + name: "updated-record.my-domain.art.", + type: "A", + ttl: 3600, + records: [{"127.0.0.1", false}] + } + + @valid_zone %Zone{ + name: "my-domain.art.", + url: "api/v1/servers/localhost/zones/my-domain.art.", + rrsets: [@record] + } - @valid_zone %Zone{name: "my-domain.art.", - url: "api/v1/servers/localhost/zones/my-domain.art."} @new_record %{ name: "new-record.my-domain.art.", type: "A", @@ -29,13 +41,7 @@ defmodule PowerDNSex.Managers.RecordsManagerTest do @record_to_delete %{ name: "record-to-delete.my-domain.art.", type: "A", - } - - @invalid_record %{ - name: "updated-record.my-domain.art.", - type: "NS", - ttl: 86_800, - records: [{"127.0.0.1", true}] + records: [] } @invalid_zone %Zone{ @@ -48,7 +54,7 @@ defmodule PowerDNSex.Managers.RecordsManagerTest do Config.set_token ExVCR.Config.cassette_library_dir("test/support/cassettes", - "test/support/custom_cassettes") + "test/support/custom_cassettes") HTTPoison.start end @@ -86,14 +92,6 @@ defmodule PowerDNSex.Managers.RecordsManagerTest do end describe "update/2" do - @tag :records_manager_update - test "exception given empty zones url" do - raise_msg = "[Records Manager] Zone URL attribute is empty!" - assert_raise RuntimeError, raise_msg, fn() -> - RecordsManager.update(%Zone{}, %Record{}) - end - end - @tag :records_manager_update test "the return given correct params" do use_cassette "records_manager/update/success" do @@ -102,21 +100,12 @@ defmodule PowerDNSex.Managers.RecordsManagerTest do end @tag :records_manager_update - test "the return given incorrect zone" do + test "when zone does not exists" do use_cassette "records_manager/update/not_found" do - response = RecordsManager.update(@invalid_zone, @updated_record) - error_msg = "Could not find domain '#{@invalid_zone.name}.'" - assert response.error == error_msg - end - end - - @tag :records_manager_update - test "the return given incorrect params" do - use_cassette "records_manager/update/invalid_record" do - response = RecordsManager.update(@valid_zone, @invalid_record) - error_msg = "Record updated-record.my-domain.art./NS '127.0.0.1': " <> - "Not in expected format (parsed as '127.0.0.1.')" - assert response.error == error_msg + {:error, error} = RecordsManager.update(@invalid_zone, @updated_record) + error_msg = "Record #{@updated_record.name}, type A, not found!" + assert error.error == error_msg + assert error.http_status_code == 404 end end end diff --git a/test/lib/powerdnsex/managers/zones_manager_test.exs b/test/lib/powerdnsex/managers/zones_manager_test.exs index d349ea8..9c011e9 100644 --- a/test/lib/powerdnsex/managers/zones_manager_test.exs +++ b/test/lib/powerdnsex/managers/zones_manager_test.exs @@ -26,6 +26,15 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do "2016060601 10800 3600 604800 3600", disabled: false} ] + }, + %RRSet{ + name: "my-domain.art.", + ttl: 3600, + type: "NS", + records: [ + %Record{content: "ns1.domain.com", + disabled: false} + ] } ] @@ -34,6 +43,7 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do account: "", serial: 2_016_060_601, url: "api/v1/servers/localhost/zones/my-domain.art.", + nameservers: ["ns1.domain.com"], rrsets: @expected_rrset} setup do @@ -49,7 +59,7 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do @tag :zones_manager_create test "return given correct parameters" do use_cassette "zones_manager/create/success" do - zone = ZonesManager.create(@valid_zone_test) + {:ok, zone} = ZonesManager.create(@valid_zone_test) assert zone.__struct__ == PowerDNSex.Models.Zone assert zone.name == @valid_zone_test.name end @@ -59,9 +69,11 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do test "return error given invalid name" do use_cassette "zones_manager/create/invalid_not_canonical" do error_msg = "DNS Name 'not-canonical-domain.tst' is not canonical" - response = ZonesManager.create(@invalid_not_canonical) - assert response.__struct__ == PowerDNSex.Models.Error - assert response.error == error_msg + {:error, error} = ZonesManager.create(@invalid_not_canonical) + + assert error.__struct__ == PowerDNSex.Models.Error + assert error.http_status_code == 422 + assert error.error == error_msg end end end @@ -70,15 +82,16 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do @tag :zones_manager_show test "type of return given a correct zone name" do use_cassette "zones_manager/show/success" do - zone = ZonesManager.show(@valid_zone_test.name) + {:ok, zone} = ZonesManager.show(@valid_zone_test.name) assert zone.__struct__ == PowerDNSex.Models.Zone + assert zone.nameservers == ["ns1.domain.com"] end end @tag :zones_manager_show test "values in return given a correct zone name" do use_cassette "zones_manager/show/success" do - zone = ZonesManager.show(@valid_zone_test.name) + {:ok, zone} = ZonesManager.show(@valid_zone_test.name) assert zone == @expected_zone end end @@ -87,9 +100,9 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do test "values in return given a unknown zone name" do use_cassette "zones_manager/show/not_found" do error_msg = "Could not find domain 'it-will-never-exist.on.the.art.'" - response = ZonesManager.show(@unknown_name) - assert response.__struct__ == PowerDNSex.Models.Error - assert response.error == error_msg + {:error, error} = ZonesManager.show(@unknown_name) + assert error.__struct__ == PowerDNSex.Models.Error + assert error.error == error_msg end end end @@ -98,15 +111,15 @@ defmodule PowerDNSex.Managers.ZonesManagerTest do @tag :zones_manager_delete test "return given correct params" do use_cassette "zones_manager/delete/success" do - assert ZonesManager.delete(@valid_zone_test.name) == :ok + assert ZonesManager.delete(@valid_zone_test.name) == {:ok, %{}} end end @tag :zones_manager_delete test "return error when zone don't exists" do use_cassette "zones_manager/delete/not_found" do - response = ZonesManager.delete(@unknown_name) - assert response.error == "Could not find domain '#{@unknown_name}'" + {:error, error} = ZonesManager.delete(@unknown_name) + assert error.error == "Could not find domain '#{@unknown_name}'" end end end diff --git a/test/lib/powerdnsex/models/resource_record_set_test.exs b/test/lib/powerdnsex/models/resource_record_set_test.exs new file mode 100644 index 0000000..9533beb --- /dev/null +++ b/test/lib/powerdnsex/models/resource_record_set_test.exs @@ -0,0 +1,89 @@ +defmodule PowerDNSex.Models.ResourceRecordSetTest do + + use ExUnit.Case, async: true + + alias PowerDNSex.Models.{Record} + alias PowerDNSex.Models.ResourceRecordSet, as: RRSet + + @ns_content "ns1.domain.com." + @ns2_content "ns2.domain.com." + + @domain "my-domain.art." + + @record_ns %RRSet { + name: "my-domain.art.", + ttl: 3600, + type: "NS", + records: [ + %Record{content: @ns_content, + disabled: false}, + %Record{content: @ns2_content, + disabled: false} + ] + } + + @record_a %RRSet { + name: "store.my-domain.art.", + ttl: 3600, + type: "A", + records: [ + %Record{content: "182.23.2.3", + disabled: false} + ] + } + + @rrsets [ + @record_ns, + @record_a + ] + + describe "nameservers/1" do + test "return empty list for nameserver" do + assert RRSet.nameservers([]) == [] + end + + test "return map of content records" do + assert RRSet.nameservers(@rrsets) == [@ns_content, @ns2_content] + end + end + + describe "build/1" do + test "build a record" do + raw_rrset = %{name: @domain, type: 'A', ttl: 3600, records: [ %{content: "192.168.0.1", disabled: false} ] } + rrset = %RRSet{changetype: nil, + name: "my-domain.art.", + records: [%PowerDNSex.Models.Record{content: "192.168.0.1", + disabled: false}], ttl: 3600, type: 'A'} + assert RRSet.build(raw_rrset) == rrset + end + end + + describe "find/1" do + test "find a record" do + assert RRSet.find(@rrsets, %{name: "store.my-domain.art.", type: "A"}) == @record_a + end + + test "doest not find record" do + assert RRSet.find(@rrsets, %{name: "site.my-domain.art.", type: "A"}) == nil + end + end + + describe "update/2" do + test "update passing all attributes" do + new_attrs = %{name: "page.my-domain.art.", + records: [%{content: "192.168.0.1", disabled: false}], + ttl: "3600", type: "A"} + + new_record = %PowerDNSex.Models.ResourceRecordSet{changetype: nil, + name: "store.my-domain.art.", + records: [ + %PowerDNSex.Models.Record{ + content: "192.168.0.1", + disabled: false}], + type: "A", + ttl: "3600"} + + assert RRSet.update(@record_a, new_attrs) == new_record + end + end +end diff --git a/test/support/cassettes/zones_manager/show/success.json b/test/support/cassettes/zones_manager/show/success.json index 91d5316..1d2947a 100644 --- a/test/support/cassettes/zones_manager/show/success.json +++ b/test/support/cassettes/zones_manager/show/success.json @@ -11,7 +11,7 @@ "url": "https://my-powerdns.api/api/v1/servers/localhost/zones/my-domain.art." }, "response": { - "body": "{\"account\": \"\", \"dnssec\": false, \"id\": \"my-domain.art.\", \"kind\": \"Native\", \"last_check\": 0, \"masters\": [], \"name\": \"my-domain.art.\", \"notified_serial\": 0, \"rrsets\": [{\"comments\": [], \"name\": \"my-domain.art.\", \"records\": [{\"content\": \"a.misconfigured.powerdns.server. hostmaster.my-domain.art. 2016060601 10800 3600 604800 3600\", \"disabled\": false}], \"ttl\": 3600, \"type\": \"SOA\"}], \"serial\": 2016060601, \"soa_edit\": \"\", \"soa_edit_api\": \"\", \"url\": \"api/v1/servers/localhost/zones/my-domain.art.\"}", + "body": "{\"account\":\"\",\"dnssec\":false,\"id\":\"my-domain.art.\",\"kind\":\"Native\",\"last_check\":0,\"masters\":[],\"name\":\"my-domain.art.\",\"notified_serial\":0,\"rrsets\":[{\"comments\":[],\"name\":\"my-domain.art.\",\"records\":[{\"content\":\"a.misconfigured.powerdns.server. hostmaster.my-domain.art. 2016060601 10800 3600 604800 3600\",\"disabled\":false}],\"ttl\":3600,\"type\":\"SOA\"},{\"comments\":[],\"name\":\"my-domain.art.\",\"records\":[{\"content\":\"ns1.domain.com\",\"disabled\":false}],\"ttl\":3600,\"type\":\"NS\"}],\"serial\":2016060601,\"soa_edit\":\"\",\"soa_edit_api\":\"\",\"url\":\"api/v1/servers/localhost/zones/my-domain.art.\"}", "headers": { "Access-Control-Allow-Origin": "*", "Connection": "close", diff --git a/test/support/fake_config.exs b/test/support/fake_config.exs index 9f95fc2..0c27d93 100644 --- a/test/support/fake_config.exs +++ b/test/support/fake_config.exs @@ -3,8 +3,8 @@ defmodule PowerDNSex.FakeConfig do @app_config_url "https://my-powerdns.api" - def set_url, do: Application.put_env(:powerdns, :url, @app_config_url) - def set_token, do: Application.put_env(:powerdns, :token, @app_config_token) + def set_url, do: Application.put_env(:powerdnsex, :url, @app_config_url) + def set_token, do: Application.put_env(:powerdnsex, :token, @app_config_token) def token, do: @app_config_token def url, do: @app_config_url -- cgit v1.2.3