fx 0.7.0 → 0.9.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +53 -0
  3. data/.gitignore +0 -1
  4. data/.rspec +1 -1
  5. data/.standard.yml +3 -0
  6. data/CHANGELOG.md +124 -0
  7. data/CONTRIBUTING.md +13 -4
  8. data/Gemfile +13 -2
  9. data/README.md +4 -2
  10. data/Rakefile +2 -1
  11. data/bin/setup +0 -4
  12. data/bin/standardrb +27 -0
  13. data/fx.gemspec +20 -27
  14. data/lib/fx/adapters/postgres/connection.rb +12 -0
  15. data/lib/fx/adapters/postgres/functions.rb +3 -3
  16. data/lib/fx/adapters/postgres/triggers.rb +3 -3
  17. data/lib/fx/adapters/postgres.rb +6 -14
  18. data/lib/fx/command_recorder.rb +87 -6
  19. data/lib/fx/configuration.rb +0 -25
  20. data/lib/fx/definition.rb +16 -6
  21. data/lib/fx/function.rb +7 -7
  22. data/lib/fx/schema_dumper.rb +45 -5
  23. data/lib/fx/statements.rb +228 -6
  24. data/lib/fx/trigger.rb +3 -3
  25. data/lib/fx/version.rb +1 -1
  26. data/lib/fx.rb +30 -12
  27. data/lib/generators/fx/function/function_generator.rb +8 -8
  28. data/lib/generators/fx/trigger/trigger_generator.rb +6 -10
  29. data/spec/acceptance/user_manages_functions_spec.rb +5 -5
  30. data/spec/acceptance/user_manages_triggers_spec.rb +8 -8
  31. data/spec/acceptance_helper.rb +6 -4
  32. data/spec/dummy/Rakefile +4 -4
  33. data/spec/dummy/bin/bundle +2 -2
  34. data/spec/dummy/bin/rails +3 -3
  35. data/spec/dummy/bin/rake +2 -2
  36. data/spec/dummy/config/application.rb +6 -0
  37. data/spec/dummy/config/database.yml +2 -0
  38. data/spec/dummy/config.ru +1 -1
  39. data/spec/features/functions/migrations_spec.rb +4 -4
  40. data/spec/features/functions/revert_spec.rb +7 -7
  41. data/spec/features/triggers/migrations_spec.rb +6 -6
  42. data/spec/features/triggers/revert_spec.rb +13 -13
  43. data/spec/fx/adapters/postgres/functions_spec.rb +26 -30
  44. data/spec/fx/adapters/postgres/triggers_spec.rb +34 -38
  45. data/spec/fx/adapters/postgres_spec.rb +107 -109
  46. data/spec/fx/command_recorder_spec.rb +41 -39
  47. data/spec/fx/configuration_spec.rb +20 -9
  48. data/spec/fx/definition_spec.rb +30 -38
  49. data/spec/fx/function_spec.rb +45 -48
  50. data/spec/fx/schema_dumper_spec.rb +123 -0
  51. data/spec/fx/statements_spec.rb +217 -0
  52. data/spec/fx/trigger_spec.rb +37 -40
  53. data/spec/fx_spec.rb +28 -0
  54. data/spec/generators/fx/function/function_generator_spec.rb +6 -6
  55. data/spec/generators/fx/trigger/trigger_generator_spec.rb +10 -10
  56. data/spec/spec_helper.rb +5 -0
  57. data/spec/support/definition_helpers.rb +5 -9
  58. data/spec/support/generator_setup.rb +1 -1
  59. data/spec/support/migration_helpers.rb +1 -1
  60. data/spec/support/warning_helper.rb +5 -0
  61. metadata +24 -213
  62. data/.hound.yml +0 -2
  63. data/.rubocop.yml +0 -648
  64. data/.travis.yml +0 -60
  65. data/Appraisals +0 -45
  66. data/bin/appraisal +0 -17
  67. data/gemfiles/rails42.gemfile +0 -10
  68. data/gemfiles/rails50.gemfile +0 -8
  69. data/gemfiles/rails51.gemfile +0 -8
  70. data/gemfiles/rails52.gemfile +0 -8
  71. data/gemfiles/rails60.gemfile +0 -8
  72. data/gemfiles/rails61.gemfile +0 -8
  73. data/gemfiles/rails_edge.gemfile +0 -8
  74. data/lib/fx/command_recorder/arguments.rb +0 -43
  75. data/lib/fx/command_recorder/function.rb +0 -30
  76. data/lib/fx/command_recorder/trigger.rb +0 -30
  77. data/lib/fx/schema_dumper/function.rb +0 -38
  78. data/lib/fx/schema_dumper/trigger.rb +0 -29
  79. data/lib/fx/statements/function.rb +0 -115
  80. data/lib/fx/statements/trigger.rb +0 -146
  81. data/spec/fx/command_recorder/arguments_spec.rb +0 -41
  82. data/spec/fx/schema_dumper/function_spec.rb +0 -80
  83. data/spec/fx/schema_dumper/trigger_spec.rb +0 -40
  84. data/spec/fx/statements/function_spec.rb +0 -103
  85. data/spec/fx/statements/trigger_spec.rb +0 -132
@@ -1,8 +1,8 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Function migrations", :db do
3
+ RSpec.describe "Function migrations", :db do
4
4
  around do |example|
5
- sql_definition = <<-EOS
5
+ sql_definition = <<~EOS
6
6
  CREATE OR REPLACE FUNCTION test()
7
7
  RETURNS text AS $$
8
8
  BEGIN
@@ -40,7 +40,7 @@ describe "Function migrations", :db do
40
40
  it "can run migrations that updates functions" do
41
41
  connection.create_function(:test)
42
42
 
43
- sql_definition = <<-EOS
43
+ sql_definition = <<~EOS
44
44
  CREATE OR REPLACE FUNCTION test()
45
45
  RETURNS text AS $$
46
46
  BEGIN
@@ -51,7 +51,7 @@ describe "Function migrations", :db do
51
51
  with_function_definition(
52
52
  name: :test,
53
53
  version: 2,
54
- sql_definition: sql_definition,
54
+ sql_definition: sql_definition
55
55
  ) do
56
56
  migration = Class.new(migration_class) do
57
57
  def change
@@ -1,8 +1,8 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Reverting migrations", :db do
3
+ RSpec.describe "Reverting migrations", :db do
4
4
  around do |example|
5
- sql_definition = <<-EOS
5
+ sql_definition = <<~EOS
6
6
  CREATE OR REPLACE FUNCTION test()
7
7
  RETURNS text AS $$
8
8
  BEGIN
@@ -40,17 +40,17 @@ describe "Reverting migrations", :db do
40
40
  end
41
41
 
42
42
  expect { run_migration(good_migration, [:up, :down]) }.not_to raise_error
43
- expect { run_migration(bad_migration, [:up, :down]) }.
44
- to raise_error(
43
+ expect { run_migration(bad_migration, [:up, :down]) }
44
+ .to raise_error(
45
45
  ActiveRecord::IrreversibleMigration,
46
- /`create_function` is reversible only if given a `revert_to_version`/,
46
+ /`create_function` is reversible only if given a `revert_to_version`/
47
47
  )
48
48
  end
49
49
 
50
50
  it "can run reversible migrations for updating functions" do
51
51
  connection.create_function(:test)
52
52
 
53
- sql_definition = <<-EOS
53
+ sql_definition = <<~EOS
54
54
  CREATE OR REPLACE FUNCTION test()
55
55
  RETURNS text AS $$
56
56
  BEGIN
@@ -61,7 +61,7 @@ describe "Reverting migrations", :db do
61
61
  with_function_definition(
62
62
  name: :test,
63
63
  version: 2,
64
- sql_definition: sql_definition,
64
+ sql_definition: sql_definition
65
65
  ) do
66
66
  migration = Class.new(migration_class) do
67
67
  def change
@@ -1,15 +1,15 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Trigger migrations", :db do
3
+ RSpec.describe "Trigger migrations", :db do
4
4
  around do |example|
5
- connection.execute <<-EOS
5
+ connection.execute <<~EOS
6
6
  CREATE TABLE users (
7
7
  id int PRIMARY KEY,
8
8
  name varchar(256),
9
9
  upper_name varchar(256)
10
10
  );
11
11
  EOS
12
- Fx.database.create_function <<-EOS
12
+ Fx.database.create_function <<~EOS
13
13
  CREATE OR REPLACE FUNCTION uppercase_users_name()
14
14
  RETURNS trigger AS $$
15
15
  BEGIN
@@ -18,15 +18,15 @@ describe "Trigger migrations", :db do
18
18
  END;
19
19
  $$ LANGUAGE plpgsql;
20
20
  EOS
21
- sql_definition = <<-EOS
21
+ sql_definition = <<~EOS
22
22
  CREATE TRIGGER uppercase_users_name
23
23
  BEFORE INSERT ON users
24
24
  FOR EACH ROW
25
- EXECUTE PROCEDURE uppercase_users_name();
25
+ EXECUTE FUNCTION uppercase_users_name();
26
26
  EOS
27
27
  with_trigger_definition(
28
28
  name: :uppercase_users_name,
29
- sql_definition: sql_definition,
29
+ sql_definition: sql_definition
30
30
  ) do
31
31
  example.run
32
32
  end
@@ -1,15 +1,15 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Reverting migrations", :db do
3
+ RSpec.describe "Reverting migrations", :db do
4
4
  around do |example|
5
- connection.execute <<-EOS
5
+ connection.execute <<~EOS
6
6
  CREATE TABLE users (
7
7
  id int PRIMARY KEY,
8
8
  name varchar(256),
9
9
  upper_name varchar(256)
10
10
  );
11
11
  EOS
12
- Fx.database.create_function <<-EOS
12
+ Fx.database.create_function <<~EOS
13
13
  CREATE OR REPLACE FUNCTION uppercase_users_name()
14
14
  RETURNS trigger AS $$
15
15
  BEGIN
@@ -18,15 +18,15 @@ describe "Reverting migrations", :db do
18
18
  END;
19
19
  $$ LANGUAGE plpgsql;
20
20
  EOS
21
- sql_definition = <<-EOS
21
+ sql_definition = <<~EOS
22
22
  CREATE TRIGGER uppercase_users_name
23
23
  BEFORE INSERT ON users
24
24
  FOR EACH ROW
25
- EXECUTE PROCEDURE uppercase_users_name();
25
+ EXECUTE FUNCTION uppercase_users_name();
26
26
  EOS
27
27
  with_trigger_definition(
28
28
  name: :uppercase_users_name,
29
- sql_definition: sql_definition,
29
+ sql_definition: sql_definition
30
30
  ) do
31
31
  example.run
32
32
  end
@@ -57,26 +57,26 @@ describe "Reverting migrations", :db do
57
57
  end
58
58
 
59
59
  expect { run_migration(good_migration, [:up, :down]) }.not_to raise_error
60
- expect { run_migration(bad_migration, [:up, :down]) }.
61
- to raise_error(
60
+ expect { run_migration(bad_migration, [:up, :down]) }
61
+ .to raise_error(
62
62
  ActiveRecord::IrreversibleMigration,
63
- /`create_trigger` is reversible only if given a `revert_to_version`/,
63
+ /`create_trigger` is reversible only if given a `revert_to_version`/
64
64
  )
65
65
  end
66
66
 
67
67
  it "can run reversible migrations for updating triggers" do
68
68
  connection.create_trigger(:uppercase_users_name)
69
69
 
70
- sql_definition = <<-EOS
70
+ sql_definition = <<~EOS
71
71
  CREATE TRIGGER uppercase_users_name
72
72
  BEFORE UPDATE ON users
73
73
  FOR EACH ROW
74
- EXECUTE PROCEDURE uppercase_users_name();
74
+ EXECUTE FUNCTION uppercase_users_name();
75
75
  EOS
76
76
  with_trigger_definition(
77
77
  name: :uppercase_users_name,
78
78
  sql_definition: sql_definition,
79
- version: 2,
79
+ version: 2
80
80
  ) do
81
81
  migration = Class.new(migration_class) do
82
82
  def change
@@ -84,7 +84,7 @@ describe "Reverting migrations", :db do
84
84
  :uppercase_users_name,
85
85
  on: :users,
86
86
  version: 2,
87
- revert_to_version: 1,
87
+ revert_to_version: 1
88
88
  )
89
89
  end
90
90
  end
@@ -1,37 +1,33 @@
1
1
  require "spec_helper"
2
2
 
3
- module Fx
4
- module Adapters
5
- describe Postgres::Functions, :db do
6
- describe ".all" do
7
- it "returns `Function` objects" do
8
- connection = ActiveRecord::Base.connection
9
- connection.execute <<-EOS.strip_heredoc
10
- CREATE OR REPLACE FUNCTION test()
11
- RETURNS text AS $$
12
- BEGIN
13
- RETURN 'test';
14
- END;
15
- $$ LANGUAGE plpgsql;
16
- EOS
3
+ RSpec.describe Fx::Adapters::Postgres::Functions, :db do
4
+ describe ".all" do
5
+ it "returns `Function` objects" do
6
+ connection = ActiveRecord::Base.connection
7
+ connection.execute <<~EOS
8
+ CREATE OR REPLACE FUNCTION test()
9
+ RETURNS text AS $$
10
+ BEGIN
11
+ RETURN 'test';
12
+ END;
13
+ $$ LANGUAGE plpgsql;
14
+ EOS
17
15
 
18
- functions = Postgres::Functions.new(connection).all
16
+ functions = Fx::Adapters::Postgres::Functions.new(connection).all
19
17
 
20
- first = functions.first
21
- expect(functions.size).to eq 1
22
- expect(first.name).to eq "test"
23
- expect(first.definition).to eq <<-EOS.strip_heredoc
24
- CREATE OR REPLACE FUNCTION public.test()
25
- RETURNS text
26
- LANGUAGE plpgsql
27
- AS $function$
28
- BEGIN
29
- RETURN 'test';
30
- END;
31
- $function$
32
- EOS
33
- end
34
- end
18
+ first = functions.first
19
+ expect(functions.size).to eq(1)
20
+ expect(first.name).to eq("test")
21
+ expect(first.definition).to eq(<<~EOS)
22
+ CREATE OR REPLACE FUNCTION public.test()
23
+ RETURNS text
24
+ LANGUAGE plpgsql
25
+ AS $function$
26
+ BEGIN
27
+ RETURN 'test';
28
+ END;
29
+ $function$
30
+ EOS
35
31
  end
36
32
  end
37
33
  end
@@ -1,45 +1,41 @@
1
1
  require "spec_helper"
2
2
 
3
- module Fx
4
- module Adapters
5
- describe Postgres::Triggers, :db do
6
- describe ".all" do
7
- it "returns `Trigger` objects" do
8
- connection = ActiveRecord::Base.connection
9
- connection.execute <<-EOS.strip_heredoc
10
- CREATE TABLE users (
11
- id int PRIMARY KEY,
12
- name varchar(256),
13
- upper_name varchar(256)
14
- );
15
- EOS
16
- connection.execute <<-EOS.strip_heredoc
17
- CREATE OR REPLACE FUNCTION uppercase_users_name()
18
- RETURNS trigger AS $$
19
- BEGIN
20
- NEW.upper_name = UPPER(NEW.name);
21
- RETURN NEW;
22
- END;
23
- $$ LANGUAGE plpgsql;
24
- EOS
25
- connection.execute <<-EOS.strip_heredoc
26
- CREATE TRIGGER uppercase_users_name
27
- BEFORE INSERT ON users
28
- FOR EACH ROW
29
- EXECUTE PROCEDURE uppercase_users_name();
30
- EOS
3
+ RSpec.describe Fx::Adapters::Postgres::Triggers, :db do
4
+ describe ".all" do
5
+ it "returns `Trigger` objects" do
6
+ connection = ActiveRecord::Base.connection
7
+ connection.execute <<~EOS
8
+ CREATE TABLE users (
9
+ id int PRIMARY KEY,
10
+ name varchar(256),
11
+ upper_name varchar(256)
12
+ );
13
+ EOS
14
+ connection.execute <<~EOS
15
+ CREATE OR REPLACE FUNCTION uppercase_users_name()
16
+ RETURNS trigger AS $$
17
+ BEGIN
18
+ NEW.upper_name = UPPER(NEW.name);
19
+ RETURN NEW;
20
+ END;
21
+ $$ LANGUAGE plpgsql;
22
+ EOS
23
+ connection.execute <<~EOS
24
+ CREATE TRIGGER uppercase_users_name
25
+ BEFORE INSERT ON users
26
+ FOR EACH ROW
27
+ EXECUTE FUNCTION uppercase_users_name();
28
+ EOS
31
29
 
32
- triggers = Postgres::Triggers.new(connection).all
30
+ triggers = Fx::Adapters::Postgres::Triggers.new(connection).all
33
31
 
34
- first = triggers.first
35
- expect(triggers.size).to eq 1
36
- expect(first.name).to eq "uppercase_users_name"
37
- expect(first.definition).to include("BEFORE INSERT")
38
- expect(first.definition).to match(/ON [public\.users|users]/)
39
- expect(first.definition).to include("FOR EACH ROW")
40
- expect(first.definition).to include("EXECUTE PROCEDURE uppercase_users_name()")
41
- end
42
- end
32
+ first = triggers.first
33
+ expect(triggers.size).to eq(1)
34
+ expect(first.name).to eq("uppercase_users_name")
35
+ expect(first.definition).to include("BEFORE INSERT")
36
+ expect(first.definition).to match(/ON [public.ser|]/)
37
+ expect(first.definition).to include("FOR EACH ROW")
38
+ expect(first.definition).to include("EXECUTE FUNCTION uppercase_users_name()")
43
39
  end
44
40
  end
45
41
  end
@@ -1,104 +1,82 @@
1
1
  require "spec_helper"
2
2
 
3
- module Fx::Adapters
4
- describe Postgres, :db do
5
- describe "#create_function" do
6
- it "successfully creates a function" do
7
- adapter = Postgres.new
8
- adapter.create_function(
9
- <<-EOS
10
- CREATE OR REPLACE FUNCTION test()
11
- RETURNS text AS $$
12
- BEGIN
13
- RETURN 'test';
14
- END;
15
- $$ LANGUAGE plpgsql;
16
- EOS
17
- )
18
-
19
- expect(adapter.functions.map(&:name)).to include("test")
20
- end
21
- end
22
-
23
- describe "#create_trigger" do
24
- it "successfully creates a trigger" do
25
- connection.execute <<-EOS
26
- CREATE TABLE users (
27
- id int PRIMARY KEY,
28
- name varchar(256),
29
- upper_name varchar(256)
30
- );
31
- EOS
32
- adapter = Postgres.new
33
- adapter.create_function <<-EOS
34
- CREATE OR REPLACE FUNCTION uppercase_users_name()
35
- RETURNS trigger AS $$
3
+ RSpec.describe Fx::Adapters::Postgres, :db do
4
+ describe "#create_function" do
5
+ it "successfully creates a function" do
6
+ adapter = Fx::Adapters::Postgres.new
7
+ adapter.create_function(
8
+ <<~EOS
9
+ CREATE OR REPLACE FUNCTION test()
10
+ RETURNS text AS $$
36
11
  BEGIN
37
- NEW.upper_name = UPPER(NEW.name);
38
- RETURN NEW;
12
+ RETURN 'test';
39
13
  END;
40
14
  $$ LANGUAGE plpgsql;
41
15
  EOS
42
- adapter.create_trigger(
43
- <<-EOS
44
- CREATE TRIGGER uppercase_users_name
45
- BEFORE INSERT ON users
46
- FOR EACH ROW
47
- EXECUTE PROCEDURE uppercase_users_name();
48
- EOS
49
- )
16
+ )
50
17
 
51
- expect(adapter.triggers.map(&:name)).to include("uppercase_users_name")
52
- end
18
+ expect(adapter.functions.map(&:name)).to include("test")
53
19
  end
20
+ end
54
21
 
55
- describe "#drop_function" do
56
- context "when the function has arguments" do
57
- it "successfully drops a function with the entire function signature" do
58
- adapter = Postgres.new
59
- adapter.create_function(
60
- <<-EOS
61
- CREATE FUNCTION adder(x int, y int)
62
- RETURNS int AS $$
63
- BEGIN
64
- RETURN $1 + $2;
65
- END;
66
- $$ LANGUAGE plpgsql;
67
- EOS
68
- )
69
-
70
- adapter.drop_function(:adder)
22
+ describe "#create_trigger" do
23
+ it "successfully creates a trigger" do
24
+ connection.execute <<~EOS
25
+ CREATE TABLE users (
26
+ id int PRIMARY KEY,
27
+ name varchar(256),
28
+ upper_name varchar(256)
29
+ );
30
+ EOS
31
+ adapter = Fx::Adapters::Postgres.new
32
+ adapter.create_function <<~EOS
33
+ CREATE OR REPLACE FUNCTION uppercase_users_name()
34
+ RETURNS trigger AS $$
35
+ BEGIN
36
+ NEW.upper_name = UPPER(NEW.name);
37
+ RETURN NEW;
38
+ END;
39
+ $$ LANGUAGE plpgsql;
40
+ EOS
41
+ adapter.create_trigger(
42
+ <<~EOS
43
+ CREATE TRIGGER uppercase_users_name
44
+ BEFORE INSERT ON users
45
+ FOR EACH ROW
46
+ EXECUTE FUNCTION uppercase_users_name();
47
+ EOS
48
+ )
71
49
 
72
- expect(adapter.functions.map(&:name)).not_to include("adder")
73
- end
74
- end
50
+ expect(adapter.triggers.map(&:name)).to include("uppercase_users_name")
51
+ end
52
+ end
75
53
 
76
- context "when the function does not have arguments" do
77
- it "successfully drops a function" do
78
- adapter = Postgres.new
79
- adapter.create_function(
80
- <<-EOS
81
- CREATE OR REPLACE FUNCTION test()
82
- RETURNS text AS $$
83
- BEGIN
84
- RETURN 'test';
85
- END;
86
- $$ LANGUAGE plpgsql;
87
- EOS
88
- )
54
+ describe "#drop_function" do
55
+ context "when the function has arguments" do
56
+ it "successfully drops a function with the entire function signature" do
57
+ adapter = Fx::Adapters::Postgres.new
58
+ adapter.create_function(
59
+ <<~EOS
60
+ CREATE FUNCTION adder(x int, y int)
61
+ RETURNS int AS $$
62
+ BEGIN
63
+ RETURN $1 + $2;
64
+ END;
65
+ $$ LANGUAGE plpgsql;
66
+ EOS
67
+ )
89
68
 
90
- adapter.drop_function(:test)
69
+ adapter.drop_function(:adder)
91
70
 
92
- expect(adapter.functions.map(&:name)).not_to include("test")
93
- end
71
+ expect(adapter.functions.map(&:name)).not_to include("adder")
94
72
  end
95
73
  end
96
74
 
97
- describe "#functions" do
98
- it "finds functions and builds Fx::Function objects" do
99
- adapter = Postgres.new
75
+ context "when the function does not have arguments" do
76
+ it "successfully drops a function" do
77
+ adapter = Fx::Adapters::Postgres.new
100
78
  adapter.create_function(
101
- <<-EOS
79
+ <<~EOS
102
80
  CREATE OR REPLACE FUNCTION test()
103
81
  RETURNS text AS $$
104
82
  BEGIN
@@ -108,39 +86,59 @@ module Fx::Adapters
108
86
  EOS
109
87
  )
110
88
 
111
- expect(adapter.functions.map(&:name)).to eq ["test"]
89
+ adapter.drop_function(:test)
90
+
91
+ expect(adapter.functions.map(&:name)).not_to include("test")
112
92
  end
113
93
  end
94
+ end
114
95
 
115
- describe "#triggers" do
116
- it "finds triggers and builds Fx::Trigger objects" do
117
- connection.execute <<-EOS
118
- CREATE TABLE users (
119
- id int PRIMARY KEY,
120
- name varchar(256),
121
- upper_name varchar(256)
122
- );
123
- EOS
124
- adapter = Postgres.new
125
- adapter.create_function <<-EOS
126
- CREATE OR REPLACE FUNCTION uppercase_users_name()
127
- RETURNS trigger AS $$
96
+ describe "#functions" do
97
+ it "finds functions and builds Fx::Function objects" do
98
+ adapter = Fx::Adapters::Postgres.new
99
+ adapter.create_function(
100
+ <<~EOS
101
+ CREATE OR REPLACE FUNCTION test()
102
+ RETURNS text AS $$
128
103
  BEGIN
129
- NEW.upper_name = UPPER(NEW.name);
130
- RETURN NEW;
104
+ RETURN 'test';
131
105
  END;
132
106
  $$ LANGUAGE plpgsql;
133
107
  EOS
134
- sql_definition = <<-EOS
135
- CREATE TRIGGER uppercase_users_name
136
- BEFORE INSERT ON users
137
- FOR EACH ROW
138
- EXECUTE PROCEDURE uppercase_users_name()
139
- EOS
140
- adapter.create_trigger(sql_definition)
108
+ )
141
109
 
142
- expect(adapter.triggers.map(&:name)).to eq ["uppercase_users_name"]
143
- end
110
+ expect(adapter.functions.map(&:name)).to eq ["test"]
111
+ end
112
+ end
113
+
114
+ describe "#triggers" do
115
+ it "finds triggers and builds Fx::Trigger objects" do
116
+ connection.execute <<~EOS
117
+ CREATE TABLE users (
118
+ id int PRIMARY KEY,
119
+ name varchar(256),
120
+ upper_name varchar(256)
121
+ );
122
+ EOS
123
+ adapter = Fx::Adapters::Postgres.new
124
+ adapter.create_function <<~EOS
125
+ CREATE OR REPLACE FUNCTION uppercase_users_name()
126
+ RETURNS trigger AS $$
127
+ BEGIN
128
+ NEW.upper_name = UPPER(NEW.name);
129
+ RETURN NEW;
130
+ END;
131
+ $$ LANGUAGE plpgsql;
132
+ EOS
133
+ sql_definition = <<~EOS
134
+ CREATE TRIGGER uppercase_users_name
135
+ BEFORE INSERT ON users
136
+ FOR EACH ROW
137
+ EXECUTE FUNCTION uppercase_users_name()
138
+ EOS
139
+ adapter.create_trigger(sql_definition)
140
+
141
+ expect(adapter.triggers.map(&:name)).to eq ["uppercase_users_name"]
144
142
  end
145
143
  end
146
144
  end