forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFunctionTests.cs
More file actions
139 lines (124 loc) · 5.86 KB
/
FunctionTests.cs
File metadata and controls
139 lines (124 loc) · 5.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Npgsql;
using NUnit.Framework;
namespace NpgsqlTests
{
/// <summary>
/// A fixture for tests which interact with functions. All functions are dropped from the
/// database before each test starts.
/// </summary>
public class FunctionTests : TestBase
{
public FunctionTests(string backendVersion) : base(backendVersion) {}
[Test]
public void FunctionInOutParameters()
{
ExecuteNonQuery(@"CREATE OR REPLACE FUNCTION ""SomeFunction""(OUT param1 int, INOUT param2 int) RETURNS record AS
'
BEGIN
param1 = 1;
param2 = param2 + 1;
END;
' LANGUAGE 'plpgsql';");
var cmd = new NpgsqlCommand(@"""SomeFunction""", Conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new NpgsqlParameter("param1", DbType.Int32) {
Direction = ParameterDirection.Output
});
cmd.Parameters.Add(new NpgsqlParameter("param2", DbType.Int32) {
Direction = ParameterDirection.InputOutput,
Value = 5
});
using (var rdr = cmd.ExecuteReader())
{
Assert.That(rdr.Read(), Is.True);
Assert.That(rdr.GetInt32(0), Is.EqualTo(1));
Assert.That(rdr.GetInt32(1), Is.EqualTo(6));
Assert.That(rdr.Read(), Is.False);
}
}
[Test, Description("Tests function parameter derivation with IN, OUT and INOUT parameters")]
public void DeriveParametersVarious()
{
// This function returns record because of the two Out (InOut & Out) parameters
ExecuteNonQuery(@"CREATE OR REPLACE FUNCTION ""func""(IN param1 INT, OUT param2 text, INOUT param3 INT) RETURNS record AS
'
BEGIN
param2 = ''sometext'';
param3 = param1 + param3;
END;
' LANGUAGE 'plpgsql';");
var cmd = new NpgsqlCommand("func", Conn);
cmd.CommandType = CommandType.StoredProcedure;
NpgsqlCommandBuilder.DeriveParameters(cmd);
Assert.That(cmd.Parameters, Has.Count.EqualTo(3));
Assert.That(cmd.Parameters[0].Direction, Is.EqualTo(ParameterDirection.Input));
Assert.That(cmd.Parameters[1].Direction, Is.EqualTo(ParameterDirection.Output));
Assert.That(cmd.Parameters[2].Direction, Is.EqualTo(ParameterDirection.InputOutput));
cmd.Parameters[0].Value = 5;
cmd.Parameters[2].Value = 4;
cmd.ExecuteNonQuery();
Assert.That(cmd.Parameters[0].Value, Is.EqualTo(5));
Assert.That(cmd.Parameters[1].Value, Is.EqualTo("sometext"));
Assert.That(cmd.Parameters[2].Value, Is.EqualTo(9));
}
[Test, Description("Tests function parameter derivation with IN-only parameters")]
public void DeriveParametersInOnly()
{
// This function returns record because of the two Out (InOut & Out) parameters
ExecuteNonQuery(@"CREATE OR REPLACE FUNCTION ""func""(IN param1 INT, IN param2 INT) RETURNS int AS
'
BEGIN
RETURN param1 + param2;
END;
' LANGUAGE 'plpgsql';");
var cmd = new NpgsqlCommand("func", Conn);
cmd.CommandType = CommandType.StoredProcedure;
NpgsqlCommandBuilder.DeriveParameters(cmd);
Assert.That(cmd.Parameters, Has.Count.EqualTo(2));
Assert.That(cmd.Parameters[0].Direction, Is.EqualTo(ParameterDirection.Input));
Assert.That(cmd.Parameters[1].Direction, Is.EqualTo(ParameterDirection.Input));
cmd.Parameters[0].Value = 5;
cmd.Parameters[1].Value = 4;
Assert.That(cmd.ExecuteScalar(), Is.EqualTo(9));
}
[Test, Description("Tests function parameter derivation with no parameters")]
public void DeriveParametersNoParams()
{
// This function returns record because of the two Out (InOut & Out) parameters
ExecuteNonQuery(@"CREATE OR REPLACE FUNCTION ""func""() RETURNS int AS
'
BEGIN
RETURN 4;
END;
' LANGUAGE 'plpgsql';");
var cmd = new NpgsqlCommand("func", Conn);
cmd.CommandType = CommandType.StoredProcedure;
NpgsqlCommandBuilder.DeriveParameters(cmd);
Assert.That(cmd.Parameters, Is.Empty);
}
#region Setup / Teardown
[SetUp]
public void Setup()
{
base.SetUp();
// Drop all functions in the public schema
const string query =
@"SELECT proname, oidvectortypes(proargtypes)
FROM pg_proc INNER JOIN pg_namespace ns ON pg_proc.pronamespace = ns.oid
WHERE ns.nspname = 'public'";
var funcs = new List<Tuple<string, string>>();
using (var cmd = new NpgsqlCommand(query, Conn))
using (var rdr = cmd.ExecuteReader())
while (rdr.Read())
funcs.Add(new Tuple<string, string>(rdr.GetString(0), rdr.GetString(1)));
foreach (var func in funcs)
ExecuteNonQuery(String.Format(@"DROP FUNCTION ""{0}"" ({1})", func.Item1, func.Item2));
}
#endregion Setup / Teardown
}
}