summaryrefslogtreecommitdiff
path: root/kitchen-tests/test/integration/webapp/serverspec/localhost/default_spec.rb
blob: f8e83829a48ddc612bf4f739141ac1c11129da7e (plain)
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

require "net/http"
require "uri"

require "#{ENV['BUSSER_ROOT']}/../kitchen/data/serverspec_helper"

describe "webapp::default", :end_to_end => true do

  describe "installed packages" do
    shared_examples_for "a package" do
      it "is installed" do
        expect(package(package_name)).to be_installed
      end
    end

    describe "#{property[:apache][:package]} package" do
      include_examples "a package" do
        let(:package_name) { property[:apache][:package] }
      end
    end

    describe "mysql-server-#{property[:mysql][:server][:version]} package" do
      include_examples "a package" do
        let(:package_name) { "mysql-server-#{property[:mysql][:server][:version]}" }
      end
    end

    describe "mysql-client-5.5 package" do
      include_examples "a package" do
        let(:package_name) { "mysql-client-5.5" }
      end
    end

    describe "php package" do
      include_examples "a package" do
        let(:package_name) { "php5" }
      end
    end
  end

  describe "enabled/running services" do
    shared_examples_for "a service" do
      it "is enabled" do
        expect(service(service_name)).to be_enabled
      end

      it "is running" do
        expect(service(service_name)).to be_enabled
      end
    end

    describe "#{property[:apache][:service_name]} service" do
      include_examples "a service" do
        let(:service_name) { property[:apache][:service_name] }
      end
    end

    describe "mysql service" do
      include_examples "a service" do
        let(:service_name) { "mysql" }
      end
    end

  end

  describe "mysql database" do
    let(:db_query) { "mysql -u root -pilikerandompasswordstoo -e \"#{statement}\"" }
    let(:statement) { "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='webapp'" }
    it "creates a database called 'webapp'" do
      expect(command(db_query)).to return_stdout(/webapp/)
    end

    describe "mysql database user 'webapp'" do
      let(:statement) { "SELECT Host, Db FROM mysql.db WHERE User='webapp'\\G" }
      it "adds user 'webapp' to database 'webapp@localhost'" do
        expect(command(db_query)).to return_stdout(/Host: localhost\n  Db: webapp/)
      end

      describe "grants" do
        shared_examples_for "a privilege" do |priv|
          let(:statement) {
            "SELECT #{priv_query}" \
            " FROM mysql.db" \
            " WHERE Host='localhost' AND Db='webapp' AND User='webapp'\\G"
          }
          let(:priv_query) { "#{priv.capitalize}_priv" }

          it "has privilege #{priv} on 'webapp@localhost'" do
            expect(command(db_query)).to return_stdout(/#{priv_query}: Y/)
          end
        end

        %w(select update insert delete create).each do |priv|
          include_examples "a privilege", priv do
          end
        end
      end
    end
  end

  describe "generated webpages" do
    let(:get_response) { Net::HTTP.get_response(uri) }
    shared_examples_for "a webpage" do
      it "exists" do
        expect(get_response).to be_kind_of(Net::HTTPSuccess)
      end

      it "displays content" do
        expect(get_response.body).to include(content)
      end
    end

    describe "http://localhost/index.html" do
      include_examples "a webpage" do
        let(:uri) { URI.parse("http://localhost/index.html") }
        let(:content) { "Hello, World!" }
      end
    end

    describe "http://localhost/index.php" do
      include_examples "a webpage" do
        let(:uri) { URI.parse("http://localhost/index.php") }
        let(:content) { "Hello, World!" }
      end
    end
  end
end