public void ConstructBasic()
        {
            var statement = new PostgresStatement("select * from frog");

            Assert.Equal("select * from frog", statement.Text);
            Assert.Empty(statement.Parameters);
            Assert.Equal(CommandType.Text, statement.Type);
        }
        public void ConstructType()
        {
            var statement = new PostgresStatement("exec proc", CommandType.StoredProcedure);

            Assert.Equal("exec proc", statement.Text);
            Assert.Empty(statement.Parameters);
            Assert.Equal(CommandType.StoredProcedure, statement.Type);
        }
        public void ConstructTypeParameters()
        {
            var statement = new PostgresStatement(
                "exec getfrogs @species, @colour", CommandType.StoredProcedure,
                new NpgsqlParameter("@species", "tree"), new NpgsqlParameter("@colour", "green"));

            Assert.Equal("exec getfrogs @species, @colour", statement.Text);
            Assert.Equal(CommandType.StoredProcedure, statement.Type);
            Assert.Equal(2, statement.Parameters.Length);
            Assert.Contains(statement.Parameters, p => p.ParameterName == "@species" && (string)p.Value == "tree");
            Assert.Contains(statement.Parameters, p => p.ParameterName == "@colour" && (string)p.Value == "green");
        }
        public void ConstructParameters()
        {
            var statement = new PostgresStatement(
                "select * from frog where species like @species and colour like @colour",
                new NpgsqlParameter("@species", "tree"), new NpgsqlParameter("@colour", "green"));

            Assert.Equal("select * from frog where species like @species and colour like @colour", statement.Text);
            Assert.Equal(CommandType.Text, statement.Type);
            Assert.Equal(2, statement.Parameters.Length);
            Assert.Contains(statement.Parameters, p => p.ParameterName == "@species" && (string)p.Value == "tree");
            Assert.Contains(statement.Parameters, p => p.ParameterName == "@colour" && (string)p.Value == "green");
        }
        public async Task General()
        {
            const int recordCount = 10;

            using (var dbGenerator = new DbGenerator())
            {
                var dbInterface = new PostgresInterface(dbGenerator.CreateDb());

                const string insertSql = "INSERT INTO frog (name, date_of_birth) VALUES (@Name, @DateOfBirth);" +
                                         "SELECT CAST(lastval() AS INT);";

                const string readSingleSql = "SELECT * FROM frog WHERE id = @Id";
                const string readAllSql    = "SELECT * FROM frog";
                const string updateSql     = "UPDATE frog SET name = @NewName WHERE id BETWEEN @FromId AND @ToId";

                var ids = new List <int>();
                for (var i = 1; i <= recordCount; i++)
                {
                    var nameParam        = new NpgsqlParameter("@Name", $"Kermit{i}");
                    var dateOfBirthParam = new NpgsqlParameter("@DateOfBirth", DateTime.Today.AddDays(-i));

                    var statement = new PostgresStatement(insertSql, nameParam, dateOfBirthParam);
                    var id        = (int)(await dbInterface.ExecuteScalarAsync(statement).ConfigureAwait(false));

                    // it's a new DB so should be the case, depending on this for following tests
                    Assert.Equal(i, id);
                    ids.Add(id);
                }

                Assert.Equal(recordCount, ids.Count);

                foreach (var id in ids)
                {
                    var idParam   = new NpgsqlParameter("@Id", id);
                    var statement = new PostgresStatement(readSingleSql, idParam);

                    using (var reader = await dbInterface.GetReaderAsync(statement).ConfigureAwait(false))
                    {
                        Assert.True(await reader.ReadAsync().ConfigureAwait(false));
                        Assert.Equal(id, reader["id"]);
                        Assert.Equal($"Kermit{id}", reader["name"]);
                        Assert.Equal(DateTime.Today.AddDays(-id), Convert.ToDateTime(reader["date_of_birth"]));
                    }
                }

                var updateStatement = new PostgresStatement(updateSql, new NpgsqlParameter("@NewName", "Frank"),
                                                            new NpgsqlParameter("@FromId", 5), new NpgsqlParameter("@ToId", 8));

                var affected = await dbInterface.ExecuteNonQueryAsync(updateStatement).ConfigureAwait(false);

                Assert.Equal(4, affected);

                var readAllStatement = new PostgresStatement(readAllSql);
                using (var reader = await dbInterface.GetReaderAsync(readAllStatement).ConfigureAwait(false))
                {
                    var count = 0;
                    while (await reader.ReadAsync().ConfigureAwait(false))
                    {
                        count++;
                        var id = (int)reader["id"];
                        if (id >= 5 && id <= 8)
                        {
                            Assert.Equal("Frank", reader["name"]);
                        }
                        else
                        {
                            Assert.Equal($"Kermit{id}", reader["name"]);
                        }
                    }

                    Assert.Equal(recordCount, count);
                }
            }
        }