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.
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