From 5ef868488de74530bf63be3e4f35905bc096af5f Mon Sep 17 00:00:00 2001 From: Nicolae Claudius Date: Wed, 2 Nov 2011 12:15:04 -0700 Subject: [PATCH] AAAA records support --- app/controllers/aaaas_controller.rb | 37 +++++ app/controllers/as_controller.rb | 2 +- app/controllers/records_controller.rb | 2 +- app/helpers/aaaas_helper.rb | 2 + app/models/aaaa.rb | 14 ++ config/locales/en.yml | 1 + config/routes.rb | 4 + spec/controllers/aaaas_controller_spec.rb | 157 ++++++++++++++++++++++ spec/helpers/aaaas_helper_spec.rb | 15 +++ spec/requests/aaaas_spec.rb | 11 ++ spec/routing/aaaas_routing_spec.rb | 35 +++++ spec/views/aaaas/edit.html.erb_spec.rb | 15 +++ spec/views/aaaas/index.html.erb_spec.rb | 14 ++ spec/views/aaaas/new.html.erb_spec.rb | 15 +++ spec/views/aaaas/show.html.erb_spec.rb | 11 ++ 15 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 app/controllers/aaaas_controller.rb create mode 100644 app/helpers/aaaas_helper.rb create mode 100644 app/models/aaaa.rb create mode 100644 spec/controllers/aaaas_controller_spec.rb create mode 100644 spec/helpers/aaaas_helper_spec.rb create mode 100644 spec/requests/aaaas_spec.rb create mode 100644 spec/routing/aaaas_routing_spec.rb create mode 100644 spec/views/aaaas/edit.html.erb_spec.rb create mode 100644 spec/views/aaaas/index.html.erb_spec.rb create mode 100644 spec/views/aaaas/new.html.erb_spec.rb create mode 100644 spec/views/aaaas/show.html.erb_spec.rb diff --git a/app/controllers/aaaas_controller.rb b/app/controllers/aaaas_controller.rb new file mode 100644 index 0000000..92cedf9 --- /dev/null +++ b/app/controllers/aaaas_controller.rb @@ -0,0 +1,37 @@ +class AaaasController < ApplicationController + active_scaffold :aaaa do |conf| + conf.columns = [:name, :type, :content, :ttl, :prio, :change_date, :authentication_token] + conf.create.columns = [:name, :content, :ttl,] + conf.update.columns = [:name, :content, :ttl] + conf.columns[:content].label = 'IP v6' + conf.columns[:content].description = 'Ex. "2001:0db8:85a3:0000:0000:8a2e:0370:7334"' + conf.columns[:change_date].list_ui = :timestamp + conf.columns[:ttl].options = {:i18n_number => {:delimiter => ''}} + conf.actions.exclude :show + end + before_filter :ensure_nested_under_domain + + protected + + # override to use :mx_records instead of :records assoc + def beginning_of_chain + if nested? && nested.association && nested.association.collection? && nested.association.name == :records + nested.parent_scope.a_records + else + super + end + end + + # override, we make our own sti logic + def new_model + model = beginning_of_chain.new + model.name = nested_parent_record.name + model.content = client_remote_ip if client_remote_ip.present? + model + end + + # override to close create form after success + def render_parent? + nested_singular_association? # || params[:parent_sti] + end +end \ No newline at end of file diff --git a/app/controllers/as_controller.rb b/app/controllers/as_controller.rb index 82d0272..47bafb1 100644 --- a/app/controllers/as_controller.rb +++ b/app/controllers/as_controller.rb @@ -3,7 +3,7 @@ class AsController < ApplicationController conf.columns = [:name, :type, :content, :ttl, :prio, :change_date, :authentication_token] conf.create.columns = [:name, :content, :ttl,] conf.update.columns = [:name, :content, :ttl] - conf.columns[:content].label = 'IP' + conf.columns[:content].label = 'IP v4' conf.columns[:content].description = 'Ex. "10.10.5.12"' conf.columns[:change_date].list_ui = :timestamp conf.columns[:ttl].options = {:i18n_number => {:delimiter => ''}} diff --git a/app/controllers/records_controller.rb b/app/controllers/records_controller.rb index bd08acf..63a26d3 100644 --- a/app/controllers/records_controller.rb +++ b/app/controllers/records_controller.rb @@ -19,7 +19,7 @@ class RecordsController < ApplicationController respond_to :html, :xml, :json active_scaffold :record do |conf| - conf.sti_children = [:SOA, :NS, :MX, :A, :CNAME, :TXT] + conf.sti_children = [:SOA, :NS, :MX, :A, :CNAME, :TXT, :AAAA] conf.columns = [:name, :type, :content, :ttl, :prio, :change_date, :authentication_token] conf.columns[:change_date].list_ui = :timestamp conf.columns[:ttl].options = {:i18n_number => {:delimiter => ''}} diff --git a/app/helpers/aaaas_helper.rb b/app/helpers/aaaas_helper.rb new file mode 100644 index 0000000..b399968 --- /dev/null +++ b/app/helpers/aaaas_helper.rb @@ -0,0 +1,2 @@ +module AaaasHelper +end \ No newline at end of file diff --git a/app/models/aaaa.rb b/app/models/aaaa.rb new file mode 100644 index 0000000..07d49c5 --- /dev/null +++ b/app/models/aaaa.rb @@ -0,0 +1,14 @@ +# = IPv6 Address Record (AAAA) +# +# IPv6 Address record. An IPv6 address for a host. Current IETF recommendation for IPv6 +# forward-mapped zones. +# +# @see http://www.ietf.org/rfc/rfc3596.txt +# @see http://www.zytrax.com/books/dns/ch8/aaaa.html +class AAAA < Record + validates :name, :hostname => {:allow_underscore => true, :allow_wildcard_hostname => true} + validates :content, :presence => true, :ip => {:ip_type => :v6} + +end + +Aaaa = AAAA diff --git a/config/locales/en.yml b/config/locales/en.yml index 324e227..e97ae61 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -14,6 +14,7 @@ en: cname: "CNAME Record" mx: "MX Record" a: "A Record" + aaaa: "AAAA Record" txt: "TXT Record" attributes: domain: diff --git a/config/routes.rb b/config/routes.rb index df14745..f565ca4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -42,6 +42,10 @@ Entrydns::Application.routes.draw do as_routes end + resources :aaaas do + as_routes + end + get '/dashboard', :to => 'dashboard#index', :as => :dashboard resources :pages, :only => :show diff --git a/spec/controllers/aaaas_controller_spec.rb b/spec/controllers/aaaas_controller_spec.rb new file mode 100644 index 0000000..396c107 --- /dev/null +++ b/spec/controllers/aaaas_controller_spec.rb @@ -0,0 +1,157 @@ +require 'spec_helper' + +# This spec was generated by rspec-rails when you ran the scaffold generator. +# It demonstrates how one might use RSpec to specify the controller code that +# was generated by Rails when you ran the scaffold generator. +# +# It assumes that the implementation code is generated by the rails scaffold +# generator. If you are using any extension libraries to generate different +# controller code, this generated spec may or may not pass. +# +# It only uses APIs available in rails and/or rspec-rails. There are a number +# of tools you can use to make these specs even more expressive, but we're +# sticking to rails and rspec-rails APIs to keep things simple and stable. +# +# Compared to earlier versions of this generator, there is very limited use of +# stubs and message expectations in this spec. Stubs are only used when there +# is no simpler way to get a handle on the object needed for the example. +# Message expectations are only used when there is no simpler way to specify +# that an instance is receiving a specific message. + +describe AaaasController do + + # This should return the minimal set of attributes required to create a valid + # Aaaa. As you add validations to Aaaa, be sure to + # update the return value of this method accordingly. + def valid_attributes + {} + end + + describe "GET index" do + it "assigns all aaaas as @aaaas" do + aaaa = Aaaa.create! valid_attributes + get :index + assigns(:aaaas).should eq([aaaa]) + end + end + + describe "GET show" do + it "assigns the requested aaaa as @aaaa" do + aaaa = Aaaa.create! valid_attributes + get :show, :id => aaaa.id.to_s + assigns(:aaaa).should eq(aaaa) + end + end + + describe "GET new" do + it "assigns a new aaaa as @aaaa" do + get :new + assigns(:aaaa).should be_a_new(Aaaa) + end + end + + describe "GET edit" do + it "assigns the requested aaaa as @aaaa" do + aaaa = Aaaa.create! valid_attributes + get :edit, :id => aaaa.id.to_s + assigns(:aaaa).should eq(aaaa) + end + end + + describe "POST create" do + describe "with valid params" do + it "creates a new Aaaa" do + expect { + post :create, :aaaa => valid_attributes + }.to change(Aaaa, :count).by(1) + end + + it "assigns a newly created aaaa as @aaaa" do + post :create, :aaaa => valid_attributes + assigns(:aaaa).should be_a(Aaaa) + assigns(:aaaa).should be_persisted + end + + it "redirects to the created aaaa" do + post :create, :aaaa => valid_attributes + response.should redirect_to(Aaaa.last) + end + end + + describe "with invalid params" do + it "assigns a newly created but unsaved aaaa as @aaaa" do + # Trigger the behavior that occurs when invalid params are submitted + Aaaa.any_instance.stub(:save).and_return(false) + post :create, :aaaa => {} + assigns(:aaaa).should be_a_new(Aaaa) + end + + it "re-renders the 'new' template" do + # Trigger the behavior that occurs when invalid params are submitted + Aaaa.any_instance.stub(:save).and_return(false) + post :create, :aaaa => {} + response.should render_template("new") + end + end + end + + describe "PUT update" do + describe "with valid params" do + it "updates the requested aaaa" do + aaaa = Aaaa.create! valid_attributes + # Assuming there are no other aaaas in the database, this + # specifies that the Aaaa created on the previous line + # receives the :update_attributes message with whatever params are + # submitted in the request. + Aaaa.any_instance.should_receive(:update_attributes).with({'these' => 'params'}) + put :update, :id => aaaa.id, :aaaa => {'these' => 'params'} + end + + it "assigns the requested aaaa as @aaaa" do + aaaa = Aaaa.create! valid_attributes + put :update, :id => aaaa.id, :aaaa => valid_attributes + assigns(:aaaa).should eq(aaaa) + end + + it "redirects to the aaaa" do + aaaa = Aaaa.create! valid_attributes + put :update, :id => aaaa.id, :aaaa => valid_attributes + response.should redirect_to(aaaa) + end + end + + describe "with invalid params" do + it "assigns the aaaa as @aaaa" do + aaaa = Aaaa.create! valid_attributes + # Trigger the behavior that occurs when invalid params are submitted + Aaaa.any_instance.stub(:save).and_return(false) + put :update, :id => aaaa.id.to_s, :aaaa => {} + assigns(:aaaa).should eq(aaaa) + end + + it "re-renders the 'edit' template" do + aaaa = Aaaa.create! valid_attributes + # Trigger the behavior that occurs when invalid params are submitted + Aaaa.any_instance.stub(:save).and_return(false) + put :update, :id => aaaa.id.to_s, :aaaa => {} + response.should render_template("edit") + end + end + end + + describe "DELETE destroy" do + it "destroys the requested aaaa" do + aaaa = Aaaa.create! valid_attributes + expect { + delete :destroy, :id => aaaa.id.to_s + }.to change(Aaaa, :count).by(-1) + end + + it "redirects to the aaaas list" do + aaaa = Aaaa.create! valid_attributes + delete :destroy, :id => aaaa.id.to_s + response.should redirect_to(aaaas_url) + end + end + +end diff --git a/spec/helpers/aaaas_helper_spec.rb b/spec/helpers/aaaas_helper_spec.rb new file mode 100644 index 0000000..a3d6c8a --- /dev/null +++ b/spec/helpers/aaaas_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the AaaasHelper. For example: +# +# describe AaaasHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# helper.concat_strings("this","that").should == "this that" +# end +# end +# end +describe AaaasHelper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/requests/aaaas_spec.rb b/spec/requests/aaaas_spec.rb new file mode 100644 index 0000000..49f512c --- /dev/null +++ b/spec/requests/aaaas_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe "Aaaas" do + describe "GET /aaaas" do + it "works! (now write some real specs)" do + # Run the generator again with the --webrat flag if you want to use webrat methods/matchers + get aaaas_path + response.status.should be(200) + end + end +end diff --git a/spec/routing/aaaas_routing_spec.rb b/spec/routing/aaaas_routing_spec.rb new file mode 100644 index 0000000..6abee4a --- /dev/null +++ b/spec/routing/aaaas_routing_spec.rb @@ -0,0 +1,35 @@ +require "spec_helper" + +describe AaaasController do + describe "routing" do + + it "routes to #index" do + get("/aaaas").should route_to("aaaas#index") + end + + it "routes to #new" do + get("/aaaas/new").should route_to("aaaas#new") + end + + it "routes to #show" do + get("/aaaas/1").should route_to("aaaas#show", :id => "1") + end + + it "routes to #edit" do + get("/aaaas/1/edit").should route_to("aaaas#edit", :id => "1") + end + + it "routes to #create" do + post("/aaaas").should route_to("aaaas#create") + end + + it "routes to #update" do + put("/aaaas/1").should route_to("aaaas#update", :id => "1") + end + + it "routes to #destroy" do + delete("/aaaas/1").should route_to("aaaas#destroy", :id => "1") + end + + end +end diff --git a/spec/views/aaaas/edit.html.erb_spec.rb b/spec/views/aaaas/edit.html.erb_spec.rb new file mode 100644 index 0000000..df5e5a3 --- /dev/null +++ b/spec/views/aaaas/edit.html.erb_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe "aaaas/edit.html.erb" do + before(:each) do + @aaaa = assign(:aaaa, stub_model(Aaaa)) + end + + it "renders the edit aaaa form" do + render + + # Run the generator again with the --webrat flag if you want to use webrat matchers + assert_select "form", :action => aaaas_path(@aaaa), :method => "post" do + end + end +end diff --git a/spec/views/aaaas/index.html.erb_spec.rb b/spec/views/aaaas/index.html.erb_spec.rb new file mode 100644 index 0000000..ca1c8ad --- /dev/null +++ b/spec/views/aaaas/index.html.erb_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe "aaaas/index.html.erb" do + before(:each) do + assign(:aaaas, [ + stub_model(Aaaa), + stub_model(Aaaa) + ]) + end + + it "renders a list of aaaas" do + render + end +end diff --git a/spec/views/aaaas/new.html.erb_spec.rb b/spec/views/aaaas/new.html.erb_spec.rb new file mode 100644 index 0000000..23d974a --- /dev/null +++ b/spec/views/aaaas/new.html.erb_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe "aaaas/new.html.erb" do + before(:each) do + assign(:aaaa, stub_model(Aaaa).as_new_record) + end + + it "renders new aaaa form" do + render + + # Run the generator again with the --webrat flag if you want to use webrat matchers + assert_select "form", :action => aaaas_path, :method => "post" do + end + end +end diff --git a/spec/views/aaaas/show.html.erb_spec.rb b/spec/views/aaaas/show.html.erb_spec.rb new file mode 100644 index 0000000..fe992fb --- /dev/null +++ b/spec/views/aaaas/show.html.erb_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe "aaaas/show.html.erb" do + before(:each) do + @aaaa = assign(:aaaa, stub_model(Aaaa)) + end + + it "renders attributes in

" do + render + end +end