summaryrefslogtreecommitdiff
path: root/test/lib/powerdnsex/managers/records_manager_test.exs
blob: 6580bd3caa48791a2bece01829796dcff6acd66c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
defmodule PowerDNSex.Managers.RecordsManagerTest do

  use ExUnit.Case, async: false
  use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney

  alias PowerDNSex.Models.{Zone, Record}
  alias PowerDNSex.Managers.RecordsManager
  alias PowerDNSex.FakeConfig, as: Config

  @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",
    ttl: 86_400,
    records: [
      {"127.0.0.1", false},
      {"192.168.0.1", true}
    ]
  }

  @updated_record %{
    name: "updated-record.my-domain.art.",
    type: "A",
    ttl: 86_800,
    records: [{"127.0.0.1", true}]
  }

  @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}]
  }

  @invalid_zone %Zone{
    name: "not-canonical-domain.tst",
    url: "api/v1/servers/localhost/zones/not-canonical-domain.tst"
  }

  setup do
    Config.set_url
    Config.set_token

    ExVCR.Config.cassette_library_dir("test/support/cassettes",
                                      "test/support/custom_cassettes")
    HTTPoison.start
  end

  describe "create/2" do
    @tag :records_manager_create
    test "exception given empty zones url" do
      raise_msg = "[Records Manager] Zone URL attribute is empty!"
      assert_raise RuntimeError, raise_msg, fn() ->
        RecordsManager.create(%Zone{}, %Record{})
      end
    end

    @tag :records_manager_create
    test "the return given correct params" do
      use_cassette "records_manager/create/success" do
        assert RecordsManager.create(@valid_zone, @new_record) == :ok
      end
    end
  end

  describe "show/2" do
    @tag :records_manager_show
    test "content given attrs of a valid record" do
      use_cassette "records_manager/show/success" do
        zone_name = @valid_zone.name
        attrs = %{name: "new-record.#{zone_name}",
                  type: "A",
                  content: "127.0.0.1"}

        record = RecordsManager.show(zone_name, attrs)
        assert record.name == attrs.name
        assert record.type == attrs.type
      end
    end
  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
        assert RecordsManager.update(@valid_zone, @updated_record) == :ok
      end
    end

    @tag :records_manager_update
    test "the return given incorrect zone" 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
      end
    end
  end

  describe "delete/2" do
    @tag :records_manager_delete
    test "the return given a correct record" do
      use_cassette "records_manager/delete/success" do
        assert RecordsManager.delete(@valid_zone, @record_to_delete) == :ok
      end
    end
  end
end