require 'spec_helper'

describe Cloudster::ChefClient do
  describe 'initialize' do
    it "should raise argument error if no argument is not provided" do
      expect { Cloudster::CloudFront.new() }.to raise_error(ArgumentError, 'Missing required argument: name')
    end
    it "should not raise argument error if all arguments are provided" do
      expect { Cloudster::CloudFront.new(:name => 'CloudFront') }.to_not raise_error
    end
  end
  describe '#add_to' do
    it "should add elastic ip configuration to ec2 template" do
      bucket = Cloudster::S3.new(:name => 'S3ResourceName',:access_control => 'PublicRead')
      cloud_front = Cloudster::CloudFront.new(:name => 'CloudFront',
                                              :default_root_object => 'index.html',
                                              :aliases => ['mysite.example.com', 'yoursite.example.com'],
                                              :enabled => true)
      cloud_front.add_to bucket
      bucket.template.should ==
        {
          "Resources"=>{
            "S3ResourceName"=>{
              "Type"=>"AWS::S3::Bucket",
              "Properties"=>{
                "AccessControl"=>"PublicRead"
              }
            },
            "CloudFront"=>{
              "Type"=>"AWS::CloudFront::Distribution",
              "Properties"=>{
                "DistributionConfig"=> {
                  "Origins"=>[{
                    "DomainName"=> {"Fn::GetAtt" => ["S3ResourceName", "DomainName"]},
                    "Id"=>"S3ResourceName",
                    "S3OriginConfig"=> {}
                  }],
                  "DefaultRootObject"=>"index.html",
                  "DefaultCacheBehavior" => {
                    "TargetOriginId" => "S3ResourceName",
                    "ForwardedValues" => {
                      "QueryString" => "false"
                    },
                    "ViewerProtocolPolicy" => "allow-all"
                  },
                  "Aliases"=>["mysite.example.com", "yoursite.example.com"],
                  "Enabled"=>"true"
                }
              }
            },
          },
          "Outputs" => {
            "S3ResourceName"=>{
              "Value"=>{
                "Fn::Join"=>[",",
                  [
                    {"Fn::Join"=>["|", ["bucket_name", {"Ref"=>"S3ResourceName"}]]},
                    {"Fn::Join"=>["|", ["dns_name", {"Fn::GetAtt"=>["S3ResourceName", "DomainName"]}]]},
                    {"Fn::Join"=>["|", ["website_url", {"Fn::GetAtt"=>["S3ResourceName", "WebsiteURL"]}]]}
                  ]
                ]
              }
            },
            "CloudFront"=>{
              "Value"=>{
                "Fn::Join"=>[",",
                  [
                    {"Fn::Join"=>["|", ["domain_name", {"Fn::GetAtt"=>["CloudFront", "DomainName"]}]]},
                    {"Fn::Join"=>["|", ["distribution_id", {"Ref"=>"CloudFront"}]]}
                  ]
                ]
              }
            }
          }
        }
    end
  end
end