activerecord-postgresql-extensions 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +4 -0
- data/Gemfile +1 -0
- data/Guardfile +3 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +10 -3
- data/lib/active_record/postgresql_extensions/adapter_extensions.rb +100 -60
- data/lib/active_record/postgresql_extensions/constraints.rb +13 -17
- data/lib/active_record/postgresql_extensions/event_triggers.rb +129 -0
- data/lib/active_record/postgresql_extensions/extensions.rb +14 -15
- data/lib/active_record/postgresql_extensions/features.rb +80 -41
- data/lib/active_record/postgresql_extensions/functions.rb +1 -1
- data/lib/active_record/postgresql_extensions/geometry.rb +6 -8
- data/lib/active_record/postgresql_extensions/indexes.rb +19 -11
- data/lib/active_record/postgresql_extensions/languages.rb +1 -1
- data/lib/active_record/postgresql_extensions/materialized_views.rb +272 -0
- data/lib/active_record/postgresql_extensions/permissions.rb +60 -22
- data/lib/active_record/postgresql_extensions/roles.rb +18 -7
- data/lib/active_record/postgresql_extensions/rules.rb +5 -0
- data/lib/active_record/postgresql_extensions/schemas.rb +39 -3
- data/lib/active_record/postgresql_extensions/sequences.rb +6 -3
- data/lib/active_record/postgresql_extensions/tables.rb +47 -19
- data/lib/active_record/postgresql_extensions/tablespaces.rb +1 -1
- data/lib/active_record/postgresql_extensions/text_search.rb +3 -3
- data/lib/active_record/postgresql_extensions/triggers.rb +3 -3
- data/lib/active_record/postgresql_extensions/types.rb +104 -1
- data/lib/active_record/postgresql_extensions/utils.rb +35 -13
- data/lib/active_record/postgresql_extensions/vacuum.rb +1 -1
- data/lib/active_record/postgresql_extensions/version.rb +1 -1
- data/lib/active_record/postgresql_extensions/views.rb +137 -6
- data/lib/activerecord-postgresql-extensions.rb +13 -11
- data/test/{adapter_tests.rb → adapter_extensions_tests.rb} +96 -3
- data/test/constraints_tests.rb +216 -104
- data/test/event_triggers_tests.rb +109 -0
- data/test/extensions_tests.rb +47 -39
- data/test/functions_tests.rb +47 -38
- data/test/geometry_tests.rb +268 -135
- data/test/{index_tests.rb → indexes_tests.rb} +16 -16
- data/test/languages_tests.rb +26 -9
- data/test/materialized_views_tests.rb +174 -0
- data/test/permissions_tests.rb +159 -45
- data/test/roles_tests.rb +17 -7
- data/test/rules_tests.rb +14 -6
- data/test/schemas_tests.rb +35 -9
- data/test/sequences_tests.rb +9 -11
- data/test/tables_tests.rb +132 -42
- data/test/tablespace_tests.rb +21 -15
- data/test/test_helper.rb +56 -10
- data/test/text_search_tests.rb +42 -44
- data/test/trigger_tests.rb +1 -3
- data/test/types_tests.rb +95 -0
- data/test/vacuum_tests.rb +1 -3
- data/test/views_tests.rb +203 -0
- metadata +22 -16
@@ -2,9 +2,7 @@
|
|
2
2
|
$: << File.dirname(__FILE__)
|
3
3
|
require 'test_helper'
|
4
4
|
|
5
|
-
class IndexTests <
|
6
|
-
include PostgreSQLExtensionsTestHelper
|
7
|
-
|
5
|
+
class IndexTests < PostgreSQLExtensionsTestCase
|
8
6
|
def test_create_index
|
9
7
|
Mig.create_index(:foo_names_idx, :foo, [ :first_name, :last_name ])
|
10
8
|
Mig.create_index(:foo_bar_id_idx, :foo, :column => :bar_id)
|
@@ -43,13 +41,13 @@ class IndexTests < MiniTest::Unit::TestCase
|
|
43
41
|
end
|
44
42
|
|
45
43
|
assert_equal([
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
44
|
+
%{CREATE INDEX "foo_names_idx" ON "foo"("first_name", "last_name");},
|
45
|
+
%{CREATE INDEX "foo_bar_id_idx" ON "foo"("bar_id");},
|
46
|
+
%{CREATE INDEX "foo_coalesce_bar_id_idx" ON "foo"((COALESCE(bar_id, 0)));},
|
47
|
+
%{CREATE INDEX "foo_search_idx" ON "foo" USING "gin"("search");},
|
48
|
+
%{CREATE INDEX "foo_names_idx" ON "foo"("name" "text_pattern_ops");},
|
49
|
+
%{CREATE UNIQUE INDEX CONCURRENTLY "foo_bar_id_idx" ON "foo"("bar_id" ASC NULLS LAST) WITH (FILLFACTOR = 10) TABLESPACE "fubar" WHERE (bar_id IS NOT NULL);},
|
50
|
+
%{CREATE INDEX "foo_bar_id_idx" ON "foo"("bar_id") WHERE ("foos"."id" IN #{escaped_array});}
|
53
51
|
], statements)
|
54
52
|
end
|
55
53
|
|
@@ -58,12 +56,14 @@ class IndexTests < MiniTest::Unit::TestCase
|
|
58
56
|
Mig.drop_index(:foo_names_idx, :if_exists => true)
|
59
57
|
Mig.drop_index(:foo_names_idx, :cascade => true)
|
60
58
|
Mig.drop_index(:foo_names_idx, :concurrently => true)
|
59
|
+
Mig.drop_index(:foo_names_idx, :bar_names_idx)
|
61
60
|
|
62
61
|
assert_equal([
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
%{DROP INDEX "foo_names_idx";},
|
63
|
+
%{DROP INDEX IF EXISTS "foo_names_idx";},
|
64
|
+
%{DROP INDEX "foo_names_idx" CASCADE;},
|
65
|
+
%{DROP INDEX CONCURRENTLY "foo_names_idx";},
|
66
|
+
%{DROP INDEX "foo_names_idx", "bar_names_idx";}
|
67
67
|
], statements)
|
68
68
|
|
69
69
|
assert_raises(ArgumentError) do
|
@@ -79,7 +79,7 @@ class IndexTests < MiniTest::Unit::TestCase
|
|
79
79
|
Mig.rename_index(:foo_names_idx, :foo_renamed_idx)
|
80
80
|
|
81
81
|
assert_equal([
|
82
|
-
|
82
|
+
%{ALTER INDEX "foo_names_idx" RENAME TO "foo_renamed_idx";}
|
83
83
|
], statements)
|
84
84
|
end
|
85
85
|
|
@@ -87,7 +87,7 @@ class IndexTests < MiniTest::Unit::TestCase
|
|
87
87
|
Mig.alter_index_tablespace(:foo_names_idx, :fubar)
|
88
88
|
|
89
89
|
assert_equal([
|
90
|
-
|
90
|
+
%{ALTER INDEX "foo_names_idx" SET TABLESPACE "fubar";}
|
91
91
|
], statements)
|
92
92
|
end
|
93
93
|
end
|
data/test/languages_tests.rb
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
$: << File.dirname(__FILE__)
|
3
3
|
require 'test_helper'
|
4
4
|
|
5
|
-
class LanguagesTests <
|
6
|
-
include PostgreSQLExtensionsTestHelper
|
7
|
-
|
5
|
+
class LanguagesTests < PostgreSQLExtensionsTestCase
|
8
6
|
def test_create_language
|
9
7
|
ARBC.create_language(:foo)
|
10
8
|
ARBC.create_language(
|
@@ -15,8 +13,8 @@ class LanguagesTests < MiniTest::Unit::TestCase
|
|
15
13
|
)
|
16
14
|
|
17
15
|
assert_equal([
|
18
|
-
|
19
|
-
|
16
|
+
%{CREATE PROCEDURAL LANGUAGE "foo";},
|
17
|
+
%{CREATE TRUSTED PROCEDURAL LANGUAGE "foo" HANDLER "plpgsql" VALIDATOR test();}
|
20
18
|
], statements)
|
21
19
|
end
|
22
20
|
|
@@ -25,8 +23,8 @@ class LanguagesTests < MiniTest::Unit::TestCase
|
|
25
23
|
ARBC.drop_language(:foo, :if_exists => true, :cascade => true)
|
26
24
|
|
27
25
|
assert_equal([
|
28
|
-
|
29
|
-
|
26
|
+
%{DROP PROCEDURAL LANGUAGE "foo";},
|
27
|
+
%{DROP PROCEDURAL LANGUAGE IF EXISTS "foo" CASCADE;}
|
30
28
|
], statements)
|
31
29
|
end
|
32
30
|
|
@@ -34,7 +32,7 @@ class LanguagesTests < MiniTest::Unit::TestCase
|
|
34
32
|
ARBC.alter_language_name(:foo, :bar)
|
35
33
|
|
36
34
|
assert_equal([
|
37
|
-
|
35
|
+
%{ALTER PROCEDURAL LANGUAGE "foo" RENAME TO "bar";}
|
38
36
|
], statements)
|
39
37
|
end
|
40
38
|
|
@@ -42,7 +40,26 @@ class LanguagesTests < MiniTest::Unit::TestCase
|
|
42
40
|
ARBC.alter_language_owner(:foo, :bar)
|
43
41
|
|
44
42
|
assert_equal([
|
45
|
-
|
43
|
+
%{ALTER PROCEDURAL LANGUAGE "foo" OWNER TO "bar";}
|
46
44
|
], statements)
|
47
45
|
end
|
46
|
+
|
47
|
+
def test_languages
|
48
|
+
ARBC.real_execute do
|
49
|
+
languages = ARBC.languages
|
50
|
+
|
51
|
+
assert_kind_of(Array, languages)
|
52
|
+
assert_includes(languages, "sql")
|
53
|
+
assert_includes(languages, "c")
|
54
|
+
assert_includes(languages, "internal")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_language_exists
|
59
|
+
ARBC.real_execute do
|
60
|
+
assert(ARBC.language_exists?("sql"))
|
61
|
+
assert(ARBC.language_exists?("c"))
|
62
|
+
assert(ARBC.language_exists?("internal"))
|
63
|
+
end
|
64
|
+
end
|
48
65
|
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
|
2
|
+
$: << File.dirname(__FILE__)
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class MaterializedViewsTests < PostgreSQLExtensionsTestCase
|
6
|
+
def test_create_materialized_view
|
7
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
8
|
+
|
9
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos")
|
10
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :columns => %w{ hello world })
|
11
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :tablespace => "foo")
|
12
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :with_data => false)
|
13
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :with_data => true)
|
14
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :with_options => {
|
15
|
+
:fillfactor => 10
|
16
|
+
})
|
17
|
+
Mig.create_materialized_view("foos_view", "SELECT * FROM foos", :with_options => "FILLFACTOR=10")
|
18
|
+
ARBC.create_materialized_view(
|
19
|
+
{ :baz => "foos_view" },
|
20
|
+
"SELECT * FROM foos"
|
21
|
+
)
|
22
|
+
|
23
|
+
assert_equal([
|
24
|
+
%{CREATE MATERIALIZED VIEW "foos_view" AS SELECT * FROM foos;},
|
25
|
+
%{CREATE MATERIALIZED VIEW "foos_view" ("hello", "world") AS SELECT * FROM foos;},
|
26
|
+
%{CREATE MATERIALIZED VIEW "foos_view" TABLESPACE "foo" AS SELECT * FROM foos;},
|
27
|
+
%{CREATE MATERIALIZED VIEW "foos_view" AS SELECT * FROM foos WITH NO DATA;},
|
28
|
+
%{CREATE MATERIALIZED VIEW "foos_view" AS SELECT * FROM foos;},
|
29
|
+
%{CREATE MATERIALIZED VIEW "foos_view" WITH ("fillfactor" = 10) AS SELECT * FROM foos;},
|
30
|
+
%{CREATE MATERIALIZED VIEW "foos_view" WITH (FILLFACTOR=10) AS SELECT * FROM foos;},
|
31
|
+
%{CREATE MATERIALIZED VIEW "baz"."foos_view" AS SELECT * FROM foos;}
|
32
|
+
], statements)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_drop_materialized_view
|
36
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
37
|
+
|
38
|
+
Mig.drop_materialized_view(:foos_view)
|
39
|
+
Mig.drop_materialized_view(:foos_view, :bars_view)
|
40
|
+
Mig.drop_materialized_view(:foos_view, :if_exists => true)
|
41
|
+
Mig.drop_materialized_view(:foos_view, :cascade => true)
|
42
|
+
|
43
|
+
assert_equal([
|
44
|
+
%{DROP MATERIALIZED VIEW "foos_view";},
|
45
|
+
%{DROP MATERIALIZED VIEW "foos_view", "bars_view";},
|
46
|
+
%{DROP MATERIALIZED VIEW IF EXISTS "foos_view";},
|
47
|
+
%{DROP MATERIALIZED VIEW "foos_view" CASCADE;}
|
48
|
+
], statements)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_rename_materialized_view
|
52
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
53
|
+
|
54
|
+
Mig.rename_materialized_view(:foos_view, :bars_view)
|
55
|
+
ARBC.rename_materialized_view({ :baz => :foos_view }, :bars_view)
|
56
|
+
|
57
|
+
ARBC.with_schema(:blort) do
|
58
|
+
Mig.rename_materialized_view(:foos_view, :bars_view)
|
59
|
+
end
|
60
|
+
|
61
|
+
assert_equal([
|
62
|
+
%{ALTER MATERIALIZED VIEW "foos_view" RENAME TO "bars_view";},
|
63
|
+
%{ALTER MATERIALIZED VIEW "baz"."foos_view" RENAME TO "bars_view";},
|
64
|
+
%{ALTER MATERIALIZED VIEW "blort"."foos_view" RENAME TO "bars_view";}
|
65
|
+
], statements)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_alter_materialized_view_set_column_default
|
69
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
70
|
+
|
71
|
+
Mig.alter_materialized_view_set_column_default(:foos, :name, "hello world")
|
72
|
+
Mig.alter_materialized_view_set_column_default(:foos, :name, nil)
|
73
|
+
Mig.alter_materialized_view_set_column_default(:foos, :name, :expression => "1 + 2")
|
74
|
+
|
75
|
+
assert_equal([
|
76
|
+
%{ALTER MATERIALIZED VIEW "foos" ALTER COLUMN "name" SET DEFAULT 'hello world';},
|
77
|
+
%{ALTER MATERIALIZED VIEW "foos" ALTER COLUMN "name" SET DEFAULT NULL;},
|
78
|
+
%{ALTER MATERIALIZED VIEW "foos" ALTER COLUMN "name" SET DEFAULT 1 + 2;}
|
79
|
+
], statements)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_alter_materialized_view_drop_column_default
|
83
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
84
|
+
|
85
|
+
Mig.alter_materialized_view_drop_column_default(:foos, :name)
|
86
|
+
|
87
|
+
assert_equal([
|
88
|
+
%{ALTER MATERIALIZED VIEW "foos" ALTER COLUMN "name" DROP DEFAULT;}
|
89
|
+
], statements)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_alter_materialized_view_owner
|
93
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
94
|
+
|
95
|
+
Mig.alter_materialized_view_owner(:foos, :joe)
|
96
|
+
|
97
|
+
assert_equal([
|
98
|
+
%{ALTER MATERIALIZED VIEW "foos" OWNER TO "joe";}
|
99
|
+
], statements)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_alter_materialized_view_schema
|
103
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
104
|
+
|
105
|
+
Mig.alter_materialized_view_schema(:foos, :bar)
|
106
|
+
|
107
|
+
assert_equal([
|
108
|
+
%{ALTER MATERIALIZED VIEW "foos" SET SCHEMA "bar";}
|
109
|
+
], statements)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_alter_materialized_view_set_options
|
113
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
114
|
+
|
115
|
+
Mig.alter_materialized_view_set_options(
|
116
|
+
"foos_view",
|
117
|
+
"security_barrier = true"
|
118
|
+
)
|
119
|
+
|
120
|
+
Mig.alter_materialized_view_set_options(:foos_view,
|
121
|
+
:security_barrier => true
|
122
|
+
)
|
123
|
+
|
124
|
+
assert_equal([
|
125
|
+
%{ALTER MATERIALIZED VIEW "foos_view" SET (security_barrier = true);},
|
126
|
+
%{ALTER MATERIALIZED VIEW "foos_view" SET ("security_barrier" = 't');}
|
127
|
+
], statements)
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_alter_materialized_view_reset_options
|
131
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
132
|
+
|
133
|
+
Mig.alter_materialized_view_reset_options(:foos_view, :security_barrier)
|
134
|
+
Mig.alter_materialized_view_reset_options(:foos_view, :security_barrier, :foos)
|
135
|
+
|
136
|
+
assert_equal([
|
137
|
+
%{ALTER MATERIALIZED VIEW "foos_view" RESET ("security_barrier");},
|
138
|
+
%{ALTER MATERIALIZED VIEW "foos_view" RESET ("security_barrier", "foos");}
|
139
|
+
], statements)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_cluster_materialized_view
|
143
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
144
|
+
|
145
|
+
Mig.cluster_materialized_view(:foos_view, :foo)
|
146
|
+
|
147
|
+
assert_equal([
|
148
|
+
%{ALTER MATERIALIZED VIEW "foos_view" CLUSTER ON "foo";}
|
149
|
+
], statements)
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_remove_cluster_from_materialized_view
|
153
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
154
|
+
|
155
|
+
Mig.remove_cluster_from_materialized_view(:foos_view)
|
156
|
+
|
157
|
+
assert_equal([
|
158
|
+
%{ALTER MATERIALIZED VIEW "foos_view" SET WITHOUT CLUSTER;}
|
159
|
+
], statements)
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_refresh_materialized_view
|
163
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
164
|
+
|
165
|
+
Mig.refresh_materialized_view(:foos_view)
|
166
|
+
Mig.refresh_materialized_view(:foos_view, :with_data => false)
|
167
|
+
|
168
|
+
assert_equal([
|
169
|
+
%{REFRESH MATERIALIZED VIEW "foos_view";},
|
170
|
+
%{REFRESH MATERIALIZED VIEW "foos_view" WITH NO DATA;}
|
171
|
+
], statements)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
data/test/permissions_tests.rb
CHANGED
@@ -2,24 +2,30 @@
|
|
2
2
|
$: << File.dirname(__FILE__)
|
3
3
|
require 'test_helper'
|
4
4
|
|
5
|
-
class PermissionsTests <
|
6
|
-
include PostgreSQLExtensionsTestHelper
|
7
|
-
|
5
|
+
class PermissionsTests < PostgreSQLExtensionsTestCase
|
8
6
|
def test_grant_table_privileges
|
9
7
|
Mig.grant_table_privileges(:foo, :select, :nobody)
|
10
8
|
Mig.grant_table_privileges(:foo, [ :select, :update, :delete, :insert ], [ :nobody, :somebody ])
|
11
9
|
Mig.grant_table_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
12
10
|
Mig.grant_table_privileges(:foo, :select, :nobody, :cascade => true)
|
13
11
|
Mig.grant_table_privileges(:foo, :select, :public, :cascade => true)
|
12
|
+
|
13
|
+
assert_equal([
|
14
|
+
%{GRANT SELECT ON TABLE "foo" TO "nobody";},
|
15
|
+
%{GRANT SELECT, UPDATE, DELETE, INSERT ON TABLE "foo" TO "nobody", "somebody";},
|
16
|
+
%{GRANT SELECT ON TABLE "foo" TO "nobody" WITH GRANT OPTION;},
|
17
|
+
%{GRANT SELECT ON TABLE "foo" TO "nobody";},
|
18
|
+
%{GRANT SELECT ON TABLE "foo" TO PUBLIC;}
|
19
|
+
], statements)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_grant_table_privileges_all
|
23
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
24
|
+
|
14
25
|
Mig.grant_table_privileges(:foo, :select, :nobody, :all => true)
|
15
26
|
|
16
27
|
assert_equal([
|
17
|
-
|
18
|
-
"GRANT SELECT, UPDATE, DELETE, INSERT ON TABLE \"foo\" TO \"nobody\", \"somebody\";",
|
19
|
-
"GRANT SELECT ON TABLE \"foo\" TO \"nobody\" WITH GRANT OPTION;",
|
20
|
-
"GRANT SELECT ON TABLE \"foo\" TO \"nobody\";",
|
21
|
-
"GRANT SELECT ON TABLE \"foo\" TO PUBLIC;",
|
22
|
-
"GRANT SELECT ON ALL TABLES IN SCHEMA \"foo\" TO \"nobody\";"
|
28
|
+
%{GRANT SELECT ON ALL TABLES IN SCHEMA "foo" TO "nobody";}
|
23
29
|
], statements)
|
24
30
|
end
|
25
31
|
|
@@ -29,63 +35,135 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
29
35
|
Mig.revoke_table_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
30
36
|
Mig.revoke_table_privileges(:foo, :select, :nobody, :cascade => true)
|
31
37
|
Mig.revoke_table_privileges(:foo, :select, :public, :cascade => true)
|
38
|
+
|
39
|
+
assert_equal([
|
40
|
+
%{REVOKE SELECT ON TABLE "foo" FROM "nobody";},
|
41
|
+
%{REVOKE SELECT, UPDATE, DELETE, INSERT ON TABLE "foo" FROM "nobody", "somebody";},
|
42
|
+
%{REVOKE SELECT ON TABLE "foo" FROM "nobody";},
|
43
|
+
%{REVOKE SELECT ON TABLE "foo" FROM "nobody" CASCADE;},
|
44
|
+
%{REVOKE SELECT ON TABLE "foo" FROM PUBLIC CASCADE;}
|
45
|
+
], statements)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_revoke_table_privileges_all
|
49
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
50
|
+
|
32
51
|
Mig.revoke_table_privileges(:foo, :select, :nobody, :all => true)
|
33
52
|
|
34
53
|
assert_equal([
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
54
|
+
%{REVOKE SELECT ON ALL TABLES IN SCHEMA "foo" FROM "nobody";}
|
55
|
+
], statements)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_grant_view_privileges
|
59
|
+
Mig.grant_view_privileges(:foo, :select, :nobody)
|
60
|
+
Mig.grant_view_privileges(:foo, [ :select, :update, :delete, :insert ], [ :nobody, :somebody ])
|
61
|
+
Mig.grant_view_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
62
|
+
Mig.grant_view_privileges(:foo, :select, :nobody, :cascade => true)
|
63
|
+
Mig.grant_view_privileges(:foo, :select, :public, :cascade => true)
|
64
|
+
|
65
|
+
assert_equal([
|
66
|
+
%{GRANT SELECT ON "foo" TO "nobody";},
|
67
|
+
%{GRANT SELECT, UPDATE, DELETE, INSERT ON "foo" TO "nobody", "somebody";},
|
68
|
+
%{GRANT SELECT ON "foo" TO "nobody" WITH GRANT OPTION;},
|
69
|
+
%{GRANT SELECT ON "foo" TO "nobody";},
|
70
|
+
%{GRANT SELECT ON "foo" TO PUBLIC;}
|
71
|
+
], statements)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_revoke_view_privileges
|
75
|
+
Mig.revoke_view_privileges(:foo, :select, :nobody)
|
76
|
+
Mig.revoke_view_privileges(:foo, [ :select, :update, :delete, :insert ], [ :nobody, :somebody ])
|
77
|
+
Mig.revoke_view_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
78
|
+
Mig.revoke_view_privileges(:foo, :select, :nobody, :cascade => true)
|
79
|
+
Mig.revoke_view_privileges(:foo, :select, :public, :cascade => true)
|
80
|
+
|
81
|
+
assert_equal([
|
82
|
+
%{REVOKE SELECT ON "foo" FROM "nobody";},
|
83
|
+
%{REVOKE SELECT, UPDATE, DELETE, INSERT ON "foo" FROM "nobody", "somebody";},
|
84
|
+
%{REVOKE SELECT ON "foo" FROM "nobody";},
|
85
|
+
%{REVOKE SELECT ON "foo" FROM "nobody" CASCADE;},
|
86
|
+
%{REVOKE SELECT ON "foo" FROM PUBLIC CASCADE;},
|
41
87
|
], statements)
|
42
88
|
end
|
43
89
|
|
44
90
|
def test_grant_sequence_privileges
|
45
91
|
Mig.grant_sequence_privileges(:foo, :select, :nobody)
|
46
92
|
Mig.grant_sequence_privileges(:foo, [ :select, :update ], [ :nobody, :somebody ])
|
93
|
+
|
94
|
+
assert_equal([
|
95
|
+
%{GRANT SELECT ON SEQUENCE "foo" TO "nobody";},
|
96
|
+
%{GRANT SELECT, UPDATE ON SEQUENCE "foo" TO "nobody", "somebody";}
|
97
|
+
], statements)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_grant_sequence_privileges_all
|
101
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
102
|
+
|
47
103
|
Mig.grant_sequence_privileges(:foo, :select, :nobody, :all => true)
|
48
104
|
|
49
105
|
assert_equal([
|
50
|
-
|
51
|
-
"GRANT SELECT, UPDATE ON SEQUENCE \"foo\" TO \"nobody\", \"somebody\";",
|
52
|
-
"GRANT SELECT ON ALL SEQUENCES IN SCHEMA \"foo\" TO \"nobody\";"
|
106
|
+
%{GRANT SELECT ON ALL SEQUENCES IN SCHEMA "foo" TO "nobody";}
|
53
107
|
], statements)
|
54
108
|
end
|
55
109
|
|
56
110
|
def test_revoke_sequence_privileges
|
57
111
|
Mig.revoke_sequence_privileges(:foo, :select, :nobody)
|
58
112
|
Mig.revoke_sequence_privileges(:foo, [ :select, :update ], [ :nobody, :somebody ])
|
113
|
+
|
114
|
+
assert_equal([
|
115
|
+
%{REVOKE SELECT ON SEQUENCE "foo" FROM "nobody";},
|
116
|
+
%{REVOKE SELECT, UPDATE ON SEQUENCE "foo" FROM "nobody", "somebody";}
|
117
|
+
], statements)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_revoke_sequence_privileges_all
|
121
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
122
|
+
|
59
123
|
Mig.revoke_sequence_privileges(:foo, :select, :nobody, :all => true)
|
60
124
|
|
61
125
|
assert_equal([
|
62
|
-
|
63
|
-
"REVOKE SELECT, UPDATE ON SEQUENCE \"foo\" FROM \"nobody\", \"somebody\";",
|
64
|
-
"REVOKE SELECT ON ALL SEQUENCES IN SCHEMA \"foo\" FROM \"nobody\";"
|
126
|
+
%{REVOKE SELECT ON ALL SEQUENCES IN SCHEMA "foo" FROM "nobody";}
|
65
127
|
], statements)
|
66
128
|
end
|
67
129
|
|
68
130
|
def test_grant_function_privileges
|
69
131
|
Mig.grant_function_privileges('test(text, integer)', :execute, :nobody)
|
70
132
|
Mig.grant_function_privileges('test(text, integer)', :all, [ :nobody, :somebody ])
|
133
|
+
|
134
|
+
assert_equal([
|
135
|
+
%{GRANT EXECUTE ON FUNCTION test(text, integer) TO "nobody";},
|
136
|
+
%{GRANT ALL ON FUNCTION test(text, integer) TO "nobody", "somebody";}
|
137
|
+
], statements)
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_grant_function_privileges_all
|
141
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
142
|
+
|
71
143
|
Mig.grant_function_privileges(:foo, :execute, :nobody, :all => true)
|
72
144
|
|
73
145
|
assert_equal([
|
74
|
-
|
75
|
-
"GRANT ALL ON FUNCTION test(text, integer) TO \"nobody\", \"somebody\";",
|
76
|
-
"GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA \"foo\" TO \"nobody\";",
|
146
|
+
%{GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA "foo" TO "nobody";}
|
77
147
|
], statements)
|
78
148
|
end
|
79
149
|
|
80
150
|
def test_revoke_function_privileges
|
81
151
|
Mig.revoke_function_privileges('test(text, integer)', :execute, :nobody)
|
82
152
|
Mig.revoke_function_privileges('test(text, integer)', :all, [ :nobody, :somebody ])
|
153
|
+
|
154
|
+
assert_equal([
|
155
|
+
%{REVOKE EXECUTE ON FUNCTION test(text, integer) FROM "nobody";},
|
156
|
+
%{REVOKE ALL ON FUNCTION test(text, integer) FROM "nobody", "somebody";}
|
157
|
+
], statements)
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_revoke_function_privileges_all
|
161
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.modify_mass_privileges?
|
162
|
+
|
83
163
|
Mig.revoke_function_privileges(:foo, :execute, :nobody, :all => true)
|
84
164
|
|
85
165
|
assert_equal([
|
86
|
-
|
87
|
-
"REVOKE ALL ON FUNCTION test(text, integer) FROM \"nobody\", \"somebody\";",
|
88
|
-
"REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA \"foo\" FROM \"nobody\";",
|
166
|
+
%{REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA "foo" FROM "nobody";}
|
89
167
|
], statements)
|
90
168
|
end
|
91
169
|
|
@@ -94,8 +172,8 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
94
172
|
Mig.grant_language_privileges('plpgsql', :all, [ :nobody, :somebody ])
|
95
173
|
|
96
174
|
assert_equal([
|
97
|
-
|
98
|
-
|
175
|
+
%{GRANT USAGE ON LANGUAGE "plpgsql" TO "nobody";},
|
176
|
+
%{GRANT ALL ON LANGUAGE "plpgsql" TO "nobody", "somebody";}
|
99
177
|
], statements)
|
100
178
|
end
|
101
179
|
|
@@ -104,8 +182,8 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
104
182
|
Mig.revoke_language_privileges('plpgsql', :all, [ :nobody, :somebody ])
|
105
183
|
|
106
184
|
assert_equal([
|
107
|
-
|
108
|
-
|
185
|
+
%{REVOKE USAGE ON LANGUAGE "plpgsql" FROM "nobody";},
|
186
|
+
%{REVOKE ALL ON LANGUAGE "plpgsql" FROM "nobody", "somebody";}
|
109
187
|
], statements)
|
110
188
|
end
|
111
189
|
|
@@ -114,8 +192,8 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
114
192
|
Mig.grant_schema_privileges(:foo, :all, [ :nobody, :somebody ])
|
115
193
|
|
116
194
|
assert_equal([
|
117
|
-
|
118
|
-
|
195
|
+
%{GRANT USAGE ON SCHEMA "foo" TO "nobody";},
|
196
|
+
%{GRANT ALL ON SCHEMA "foo" TO "nobody", "somebody";}
|
119
197
|
], statements)
|
120
198
|
end
|
121
199
|
|
@@ -124,8 +202,8 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
124
202
|
Mig.revoke_schema_privileges(:foo, :all, [ :nobody, :somebody ])
|
125
203
|
|
126
204
|
assert_equal([
|
127
|
-
|
128
|
-
|
205
|
+
%{REVOKE USAGE ON SCHEMA "foo" FROM "nobody";},
|
206
|
+
%{REVOKE ALL ON SCHEMA "foo" FROM "nobody", "somebody";}
|
129
207
|
], statements)
|
130
208
|
end
|
131
209
|
|
@@ -134,8 +212,8 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
134
212
|
Mig.grant_tablespace_privileges(:foo, :all, [ :nobody, :somebody ])
|
135
213
|
|
136
214
|
assert_equal([
|
137
|
-
|
138
|
-
|
215
|
+
%{GRANT CREATE ON TABLESPACE "foo" TO "nobody";},
|
216
|
+
%{GRANT ALL ON TABLESPACE "foo" TO "nobody", "somebody";}
|
139
217
|
], statements)
|
140
218
|
end
|
141
219
|
|
@@ -144,8 +222,44 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
144
222
|
Mig.revoke_tablespace_privileges(:foo, :all, [ :nobody, :somebody ])
|
145
223
|
|
146
224
|
assert_equal([
|
147
|
-
|
148
|
-
|
225
|
+
%{REVOKE CREATE ON TABLESPACE "foo" FROM "nobody";},
|
226
|
+
%{REVOKE ALL ON TABLESPACE "foo" FROM "nobody", "somebody";}
|
227
|
+
], statements)
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_grant_materialized_view_privileges
|
231
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
232
|
+
|
233
|
+
Mig.grant_materialized_view_privileges(:foo, :select, :nobody)
|
234
|
+
Mig.grant_materialized_view_privileges(:foo, [ :select, :update, :delete, :insert ], [ :nobody, :somebody ])
|
235
|
+
Mig.grant_materialized_view_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
236
|
+
Mig.grant_materialized_view_privileges(:foo, :select, :nobody, :cascade => true)
|
237
|
+
Mig.grant_materialized_view_privileges(:foo, :select, :public, :cascade => true)
|
238
|
+
|
239
|
+
assert_equal([
|
240
|
+
%{GRANT SELECT ON "foo" TO "nobody";},
|
241
|
+
%{GRANT SELECT, UPDATE, DELETE, INSERT ON "foo" TO "nobody", "somebody";},
|
242
|
+
%{GRANT SELECT ON "foo" TO "nobody" WITH GRANT OPTION;},
|
243
|
+
%{GRANT SELECT ON "foo" TO "nobody";},
|
244
|
+
%{GRANT SELECT ON "foo" TO PUBLIC;}
|
245
|
+
], statements)
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_revoke_materialized_view_privileges
|
249
|
+
skip unless ActiveRecord::PostgreSQLExtensions::Features.materialized_views?
|
250
|
+
|
251
|
+
Mig.revoke_materialized_view_privileges(:foo, :select, :nobody)
|
252
|
+
Mig.revoke_materialized_view_privileges(:foo, [ :select, :update, :delete, :insert ], [ :nobody, :somebody ])
|
253
|
+
Mig.revoke_materialized_view_privileges(:foo, :select, :nobody, :with_grant_option => true)
|
254
|
+
Mig.revoke_materialized_view_privileges(:foo, :select, :nobody, :cascade => true)
|
255
|
+
Mig.revoke_materialized_view_privileges(:foo, :select, :public, :cascade => true)
|
256
|
+
|
257
|
+
assert_equal([
|
258
|
+
%{REVOKE SELECT ON "foo" FROM "nobody";},
|
259
|
+
%{REVOKE SELECT, UPDATE, DELETE, INSERT ON "foo" FROM "nobody", "somebody";},
|
260
|
+
%{REVOKE SELECT ON "foo" FROM "nobody";},
|
261
|
+
%{REVOKE SELECT ON "foo" FROM "nobody" CASCADE;},
|
262
|
+
%{REVOKE SELECT ON "foo" FROM PUBLIC CASCADE;}
|
149
263
|
], statements)
|
150
264
|
end
|
151
265
|
|
@@ -155,9 +269,9 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
155
269
|
Mig.grant_role_membership(:foo, [ :nobody, :somebody ], :with_admin_option => true)
|
156
270
|
|
157
271
|
assert_equal([
|
158
|
-
|
159
|
-
|
160
|
-
|
272
|
+
%{GRANT "foo" TO "nobody";},
|
273
|
+
%{GRANT "foo" TO "nobody", "somebody";},
|
274
|
+
%{GRANT "foo" TO "nobody", "somebody" WITH ADMIN OPTION;}
|
161
275
|
], statements)
|
162
276
|
end
|
163
277
|
|
@@ -167,9 +281,9 @@ class PermissionsTests < MiniTest::Unit::TestCase
|
|
167
281
|
Mig.revoke_role_membership(:foo, [ :nobody, :somebody ], :with_admin_option => true)
|
168
282
|
|
169
283
|
assert_equal([
|
170
|
-
|
171
|
-
|
172
|
-
|
284
|
+
%{REVOKE "foo" FROM "nobody";},
|
285
|
+
%{REVOKE "foo" FROM "nobody", "somebody";},
|
286
|
+
%{REVOKE "foo" FROM "nobody", "somebody";}
|
173
287
|
], statements)
|
174
288
|
end
|
175
289
|
end
|