activerecord-postgresql-extensions 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +1 -0
  4. data/Guardfile +3 -3
  5. data/MIT-LICENSE +1 -1
  6. data/README.rdoc +10 -3
  7. data/lib/active_record/postgresql_extensions/adapter_extensions.rb +100 -60
  8. data/lib/active_record/postgresql_extensions/constraints.rb +13 -17
  9. data/lib/active_record/postgresql_extensions/event_triggers.rb +129 -0
  10. data/lib/active_record/postgresql_extensions/extensions.rb +14 -15
  11. data/lib/active_record/postgresql_extensions/features.rb +80 -41
  12. data/lib/active_record/postgresql_extensions/functions.rb +1 -1
  13. data/lib/active_record/postgresql_extensions/geometry.rb +6 -8
  14. data/lib/active_record/postgresql_extensions/indexes.rb +19 -11
  15. data/lib/active_record/postgresql_extensions/languages.rb +1 -1
  16. data/lib/active_record/postgresql_extensions/materialized_views.rb +272 -0
  17. data/lib/active_record/postgresql_extensions/permissions.rb +60 -22
  18. data/lib/active_record/postgresql_extensions/roles.rb +18 -7
  19. data/lib/active_record/postgresql_extensions/rules.rb +5 -0
  20. data/lib/active_record/postgresql_extensions/schemas.rb +39 -3
  21. data/lib/active_record/postgresql_extensions/sequences.rb +6 -3
  22. data/lib/active_record/postgresql_extensions/tables.rb +47 -19
  23. data/lib/active_record/postgresql_extensions/tablespaces.rb +1 -1
  24. data/lib/active_record/postgresql_extensions/text_search.rb +3 -3
  25. data/lib/active_record/postgresql_extensions/triggers.rb +3 -3
  26. data/lib/active_record/postgresql_extensions/types.rb +104 -1
  27. data/lib/active_record/postgresql_extensions/utils.rb +35 -13
  28. data/lib/active_record/postgresql_extensions/vacuum.rb +1 -1
  29. data/lib/active_record/postgresql_extensions/version.rb +1 -1
  30. data/lib/active_record/postgresql_extensions/views.rb +137 -6
  31. data/lib/activerecord-postgresql-extensions.rb +13 -11
  32. data/test/{adapter_tests.rb → adapter_extensions_tests.rb} +96 -3
  33. data/test/constraints_tests.rb +216 -104
  34. data/test/event_triggers_tests.rb +109 -0
  35. data/test/extensions_tests.rb +47 -39
  36. data/test/functions_tests.rb +47 -38
  37. data/test/geometry_tests.rb +268 -135
  38. data/test/{index_tests.rb → indexes_tests.rb} +16 -16
  39. data/test/languages_tests.rb +26 -9
  40. data/test/materialized_views_tests.rb +174 -0
  41. data/test/permissions_tests.rb +159 -45
  42. data/test/roles_tests.rb +17 -7
  43. data/test/rules_tests.rb +14 -6
  44. data/test/schemas_tests.rb +35 -9
  45. data/test/sequences_tests.rb +9 -11
  46. data/test/tables_tests.rb +132 -42
  47. data/test/tablespace_tests.rb +21 -15
  48. data/test/test_helper.rb +56 -10
  49. data/test/text_search_tests.rb +42 -44
  50. data/test/trigger_tests.rb +1 -3
  51. data/test/types_tests.rb +95 -0
  52. data/test/vacuum_tests.rb +1 -3
  53. data/test/views_tests.rb +203 -0
  54. metadata +22 -16
@@ -2,9 +2,7 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class IndexTests < MiniTest::Unit::TestCase
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
- "CREATE INDEX \"foo_names_idx\" ON \"foo\"(\"first_name\", \"last_name\");",
47
- "CREATE INDEX \"foo_bar_id_idx\" ON \"foo\"(\"bar_id\");",
48
- "CREATE INDEX \"foo_coalesce_bar_id_idx\" ON \"foo\"((COALESCE(bar_id, 0)));",
49
- "CREATE INDEX \"foo_search_idx\" ON \"foo\" USING \"gin\"(\"search\");",
50
- "CREATE INDEX \"foo_names_idx\" ON \"foo\"(\"name\" \"text_pattern_ops\");",
51
- "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);",
52
- "CREATE INDEX \"foo_bar_id_idx\" ON \"foo\"(\"bar_id\") WHERE (\"foos\".\"id\" IN #{escaped_array});",
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
- "DROP INDEX \"foo_names_idx\";",
64
- "DROP INDEX IF EXISTS \"foo_names_idx\";",
65
- "DROP INDEX \"foo_names_idx\" CASCADE;",
66
- "DROP INDEX CONCURRENTLY \"foo_names_idx\";"
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
- "ALTER INDEX \"foo_names_idx\" RENAME TO \"foo_renamed_idx\";"
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
- "ALTER INDEX \"foo_names_idx\" SET TABLESPACE \"fubar\";"
90
+ %{ALTER INDEX "foo_names_idx" SET TABLESPACE "fubar";}
91
91
  ], statements)
92
92
  end
93
93
  end
@@ -2,9 +2,7 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class LanguagesTests < MiniTest::Unit::TestCase
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
- "CREATE PROCEDURAL LANGUAGE \"foo\";",
19
- "CREATE TRUSTED PROCEDURAL LANGUAGE \"foo\" HANDLER \"plpgsql\" VALIDATOR test();"
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
- "DROP PROCEDURAL LANGUAGE \"foo\";",
29
- "DROP PROCEDURAL LANGUAGE IF EXISTS \"foo\" CASCADE;"
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
- "ALTER PROCEDURAL LANGUAGE \"foo\" RENAME TO \"bar\";"
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
- "ALTER PROCEDURAL LANGUAGE \"foo\" OWNER TO \"bar\";"
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
+
@@ -2,24 +2,30 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class PermissionsTests < MiniTest::Unit::TestCase
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
- "GRANT SELECT ON TABLE \"foo\" TO \"nobody\";",
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
- "REVOKE SELECT ON TABLE \"foo\" FROM \"nobody\";",
36
- "REVOKE SELECT, UPDATE, DELETE, INSERT ON TABLE \"foo\" FROM \"nobody\", \"somebody\";",
37
- "REVOKE SELECT ON TABLE \"foo\" FROM \"nobody\";",
38
- "REVOKE SELECT ON TABLE \"foo\" FROM \"nobody\" CASCADE;",
39
- "REVOKE SELECT ON TABLE \"foo\" FROM PUBLIC CASCADE;",
40
- "REVOKE SELECT ON ALL TABLES IN SCHEMA \"foo\" FROM \"nobody\";"
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
- "GRANT SELECT ON SEQUENCE \"foo\" TO \"nobody\";",
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
- "REVOKE SELECT ON SEQUENCE \"foo\" FROM \"nobody\";",
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
- "GRANT EXECUTE ON FUNCTION test(text, integer) TO \"nobody\";",
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
- "REVOKE EXECUTE ON FUNCTION test(text, integer) FROM \"nobody\";",
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
- "GRANT USAGE ON LANGUAGE \"plpgsql\" TO \"nobody\";",
98
- "GRANT ALL ON LANGUAGE \"plpgsql\" TO \"nobody\", \"somebody\";"
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
- "REVOKE USAGE ON LANGUAGE \"plpgsql\" FROM \"nobody\";",
108
- "REVOKE ALL ON LANGUAGE \"plpgsql\" FROM \"nobody\", \"somebody\";"
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
- "GRANT USAGE ON SCHEMA \"foo\" TO \"nobody\";",
118
- "GRANT ALL ON SCHEMA \"foo\" TO \"nobody\", \"somebody\";"
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
- "REVOKE USAGE ON SCHEMA \"foo\" FROM \"nobody\";",
128
- "REVOKE ALL ON SCHEMA \"foo\" FROM \"nobody\", \"somebody\";"
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
- "GRANT CREATE ON TABLESPACE \"foo\" TO \"nobody\";",
138
- "GRANT ALL ON TABLESPACE \"foo\" TO \"nobody\", \"somebody\";"
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
- "REVOKE CREATE ON TABLESPACE \"foo\" FROM \"nobody\";",
148
- "REVOKE ALL ON TABLESPACE \"foo\" FROM \"nobody\", \"somebody\";"
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
- "GRANT \"foo\" TO \"nobody\";",
159
- "GRANT \"foo\" TO \"nobody\", \"somebody\";",
160
- "GRANT \"foo\" TO \"nobody\", \"somebody\" WITH ADMIN OPTION;"
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
- "REVOKE \"foo\" FROM \"nobody\";",
171
- "REVOKE \"foo\" FROM \"nobody\", \"somebody\";",
172
- "REVOKE \"foo\" FROM \"nobody\", \"somebody\";"
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