-
Notifications
You must be signed in to change notification settings - Fork 60
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implemented Test containers for integration testing - phase 1 #3472
base: master
Are you sure you want to change the base?
Changes from 5 commits
f0f5e16
13b0eed
8049894
4284211
7d8ba79
dd477e2
e42747d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,126 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||
using Couchbase; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using Couchbase.Configuration.Client; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using GingerCore.Actions; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using GingerCore.Environments; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using System; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using System.Collections.Generic; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using System.Linq; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using System.Threading.Tasks; | ||||||||||||||||||||||||||||||||||||||||||||||||||
using Testcontainers.Couchbase; | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
namespace GingerCoreNETUnitTest.DatabaseTest | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
[TestClass] | ||||||||||||||||||||||||||||||||||||||||||||||||||
public sealed class CouchbaseIntegrationTests | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
private static readonly CouchbaseContainer _couchbaseContainer = new CouchbaseBuilder().Build(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
[ClassInitialize] | ||||||||||||||||||||||||||||||||||||||||||||||||||
public static async Task ClassInitialize(TestContext context) | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
await _couchbaseContainer.StartAsync(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
Check failure on line 23 in Ginger/GingerCoreNETUnitTest/DatabaseTest/CouchbaseIntegrationTests.cs
|
||||||||||||||||||||||||||||||||||||||||||||||||||
await CreateTestData(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
[TestCleanup] | ||||||||||||||||||||||||||||||||||||||||||||||||||
public Task DisposeAsync() | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
return _couchbaseContainer.DisposeAsync().AsTask(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+28
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The - public Task DisposeAsync()
+ public async Task DisposeAsync() Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
public static async Task CreateTestData() | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
try | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
// var clusterOptions = new ClusterOptions(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
// clusterOptions.ConnectionString = _couchbaseContainer.GetConnectionString(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
// clusterOptions.UserName = CouchbaseBuilder.DefaultUsername; | ||||||||||||||||||||||||||||||||||||||||||||||||||
// clusterOptions.Password = CouchbaseBuilder.DefaultPassword; | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// var cluster = await Cluster.ConnectAsync(clusterOptions) | ||||||||||||||||||||||||||||||||||||||||||||||||||
//.ConfigureAwait(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// // When | ||||||||||||||||||||||||||||||||||||||||||||||||||
// var ping = await cluster.PingAsync() | ||||||||||||||||||||||||||||||||||||||||||||||||||
// .ConfigureAwait(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// var bucket = await cluster.BucketAsync(_couchbaseContainer.Buckets.Single().Name) | ||||||||||||||||||||||||||||||||||||||||||||||||||
// .ConfigureAwait(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// When | ||||||||||||||||||||||||||||||||||||||||||||||||||
//var database = await client.Database.PutAsync() | ||||||||||||||||||||||||||||||||||||||||||||||||||
// .ConfigureAwait(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||
var cluster = new Cluster(new ClientConfiguration | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
Servers = new List<Uri> { new Uri("http://" + _couchbaseContainer.GetConnectionString()) }, | ||||||||||||||||||||||||||||||||||||||||||||||||||
UseSsl = false | ||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
cluster.Authenticate(CouchbaseBuilder.DefaultUsername, CouchbaseBuilder.DefaultPassword); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
var clusterManager = cluster.CreateManager(CouchbaseBuilder.DefaultUsername, CouchbaseBuilder.DefaultPassword); | ||||||||||||||||||||||||||||||||||||||||||||||||||
var buckets = clusterManager.ListBuckets().Value; | ||||||||||||||||||||||||||||||||||||||||||||||||||
//var result = clusterManager.CreateBucket(new BucketSettings() { Name = "GingerBucket", BucketType = Couchbase.Core.Buckets.BucketTypeEnum.Couchbase, AuthType = Couchbase.Authentication.AuthType.None }); | ||||||||||||||||||||||||||||||||||||||||||||||||||
//var bucket = cluster.OpenBucket("GingerBucket"); | ||||||||||||||||||||||||||||||||||||||||||||||||||
var bucket = cluster.OpenBucket(_couchbaseContainer.Buckets.FirstOrDefault().Name); | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+56
to
+68
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The commented-out code should be removed to keep the codebase clean and maintainable. If this code is meant for future reference, consider adding a detailed comment explaining its purpose or moving it to documentation. - // var clusterOptions = new ClusterOptions();
- // clusterOptions.ConnectionString = _couchbaseContainer.GetConnectionString();
- // clusterOptions.UserName = CouchbaseBuilder.DefaultUsername;
- // clusterOptions.Password = CouchbaseBuilder.DefaultPassword;
- // var cluster = await Cluster.ConnectAsync(clusterOptions)
- //.ConfigureAwait(true);
- // var ping = await cluster.PingAsync()
- // .ConfigureAwait(true);
- // var bucket = await cluster.BucketAsync(_couchbaseContainer.Buckets.Single().Name)
- // .ConfigureAwait(true);
- //var database = await client.Database.PutAsync()
- // .ConfigureAwait(true); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
//// Insert sample data | ||||||||||||||||||||||||||||||||||||||||||||||||||
var document = new Document<dynamic> | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
Id = "Customer", | ||||||||||||||||||||||||||||||||||||||||||||||||||
Content = new[]{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
new { Name = "Mahesh", Value = 1 , Dept = "AQE I&T"}, | ||||||||||||||||||||||||||||||||||||||||||||||||||
new { Name = "Jinendra", Value = 2, Dept = "AQE I&T"} | ||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||
var upsertResult = await bucket.UpsertAsync(document); | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
catch (Exception ex) | ||||||||||||||||||||||||||||||||||||||||||||||||||
Check notice on line 80 in Ginger/GingerCoreNETUnitTest/DatabaseTest/CouchbaseIntegrationTests.cs
|
||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
throw; | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+80
to
+83
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The catch block simply rethrows the exception without any additional handling or logging. If there's no specific error handling needed, consider removing the try-catch block to let the exception propagate naturally. - catch (Exception ex)
- {
- throw;
- } Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
[TestMethod] | ||||||||||||||||||||||||||||||||||||||||||||||||||
public void ShouldReturnTwoCustomers() | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
// Given | ||||||||||||||||||||||||||||||||||||||||||||||||||
Database db = new Database(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
ActDBValidation mact = new ActDBValidation(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
//actDBValidation | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
db.DBType = Database.eDBTypes.Couchbase; | ||||||||||||||||||||||||||||||||||||||||||||||||||
DatabaseOperations databaseOperations = new DatabaseOperations(db); | ||||||||||||||||||||||||||||||||||||||||||||||||||
db.DatabaseOperations = databaseOperations; | ||||||||||||||||||||||||||||||||||||||||||||||||||
//ATT LS DB | ||||||||||||||||||||||||||||||||||||||||||||||||||
//Db.DatabaseOperations.TNSCalculated | ||||||||||||||||||||||||||||||||||||||||||||||||||
db.TNS = "http://" + _couchbaseContainer.GetConnectionString(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
db.User = CouchbaseBuilder.DefaultUsername; | ||||||||||||||||||||||||||||||||||||||||||||||||||
db.Pass = CouchbaseBuilder.DefaultPassword; | ||||||||||||||||||||||||||||||||||||||||||||||||||
// NoSqlBase noSqlBase = new GingerCouchbase(ActDBValidation.eDBValidationType.FreeSQL, db, mact); | ||||||||||||||||||||||||||||||||||||||||||||||||||
mact.DB = db; | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Boolean connectionSuccessful = mact.DB.DatabaseOperations.Connect(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
// When | ||||||||||||||||||||||||||||||||||||||||||||||||||
List<object> recs = new List<object>(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
if (connectionSuccessful) | ||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||
mact.SQL = "SELECT * FROM `Ginger-bucket` WHERE META().id = 1"; | ||||||||||||||||||||||||||||||||||||||||||||||||||
mact.Execute(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
//db.DatabaseOperations.CloseConnection(); | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
//then | ||||||||||||||||||||||||||||||||||||||||||||||||||
Assert.AreEqual(connectionSuccessful, true, "Connected Successfully to CouchbaseDB"); | ||||||||||||||||||||||||||||||||||||||||||||||||||
//Assert.IsNotNull(recs.Count, 0); | ||||||||||||||||||||||||||||||||||||||||||||||||||
Assert.AreEqual(recs.Count, 2, "Fetched 2 records from Postgre Table"); | ||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The assertion message states "Fetched 2 records from Postgre Table," which seems to be a copy-paste error from the PostgreSQL tests. Correct the message to reflect Couchbase testing. - Assert.AreEqual(recs.Count, 2, "Fetched 2 records from Postgre Table");
+ Assert.AreEqual(recs.Count, 2, "Fetched 2 records from Couchbase bucket"); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,90 @@ | ||||||||||||||||||||||
using GingerCore.Environments; | ||||||||||||||||||||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||||||||||||||||||||
using System; | ||||||||||||||||||||||
using System.Collections.Generic; | ||||||||||||||||||||||
using System.Threading.Tasks; | ||||||||||||||||||||||
using Testcontainers.Oracle; | ||||||||||||||||||||||
using Oracle; | ||||||||||||||||||||||
using Oracle.ManagedDataAccess.Client; | ||||||||||||||||||||||
|
||||||||||||||||||||||
namespace GingerCoreNETUnitTest.DatabaseTest | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
[TestClass] | ||||||||||||||||||||||
public class OracleIntegrationTests | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
private static readonly OracleContainer _oracleContainer = new OracleBuilder().Build(); | ||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The Oracle container is instantiated without specifying an image version, which could lead to unpredictable test environments due to differences in Oracle versions. Specifying a version can help ensure consistent test results. - private static readonly OracleContainer _oracleContainer = new OracleBuilder().Build();
+ private static readonly OracleContainer _oracleContainer = new OracleBuilder().WithImage("oracle/database:19.3.0-ee").Build(); Committable suggestion
Suggested change
|
||||||||||||||||||||||
|
||||||||||||||||||||||
[ClassInitialize] | ||||||||||||||||||||||
public static async Task ClassInitialize(TestContext context) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
await _oracleContainer.StartAsync(); | ||||||||||||||||||||||
Check failure on line 20 in Ginger/GingerCoreNETUnitTest/DatabaseTest/OracleIntegrationTests.cs
|
||||||||||||||||||||||
await CreateTestData(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
[TestCleanup] | ||||||||||||||||||||||
public Task DisposeAsync() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
return _oracleContainer.DisposeAsync().AsTask(); | ||||||||||||||||||||||
Comment on lines
+25
to
+28
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar to the PostgreSQL tests, the - public Task DisposeAsync()
+ public async Task DisposeAsync() Committable suggestion
Suggested change
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
public static async Task CreateTestData() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
try | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
var scriptContent = "CREATE TABLE Customer (Id NUMBER PRIMARY KEY, Name varchar2(50));" + | ||||||||||||||||||||||
"INSERT INTO Customer (Id, Name) VALUES (1, 'Mahesh'); " + | ||||||||||||||||||||||
"INSERT INTO Customer (Id, Name) VALUES (2, 'kale');"; | ||||||||||||||||||||||
Comment on lines
+34
to
+36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The SQL script concatenation for creating and inserting data into the - var scriptContent = "CREATE TABLE Customer (Id NUMBER PRIMARY KEY, Name varchar2(50));" +
- "INSERT INTO Customer (Id, Name) VALUES (1, 'Mahesh'); " +
- "INSERT INTO Customer (Id, Name) VALUES (2, 'kale');";
+ var scriptContent = @"CREATE TABLE Customer (Id NUMBER PRIMARY KEY, Name varchar2(50));
+ INSERT INTO Customer (Id, Name) VALUES (:Id1, :Name1);
+ INSERT INTO Customer (Id, Name) VALUES (:Id2, :Name2);";
+ command.Parameters.Add(new OracleParameter(":Id1", 1));
+ command.Parameters.Add(new OracleParameter(":Name1", "Mahesh"));
+ command.Parameters.Add(new OracleParameter(":Id2", 2));
+ command.Parameters.Add(new OracleParameter(":Name2", "kale")); Committable suggestion
Suggested change
|
||||||||||||||||||||||
//var execResult = await _oracleContainer.ExecScriptAsync(scriptContent) | ||||||||||||||||||||||
// .ConfigureAwait(false); | ||||||||||||||||||||||
|
||||||||||||||||||||||
using (var connection = new OracleConnection(_oracleContainer.GetConnectionString())) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
await connection.OpenAsync(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
// Example: Create a table and insert test data | ||||||||||||||||||||||
using (var command = connection.CreateCommand()) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
command.CommandText = scriptContent; | ||||||||||||||||||||||
await command.ExecuteNonQueryAsync(); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
catch (Exception ex) | ||||||||||||||||||||||
Check notice on line 53 in Ginger/GingerCoreNETUnitTest/DatabaseTest/OracleIntegrationTests.cs
|
||||||||||||||||||||||
{ | ||||||||||||||||||||||
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
Comment on lines
+53
to
+56
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The catch block is empty, which can swallow exceptions and make debugging difficult. Consider logging the exception or rethrowing it after handling. - catch (Exception ex)
- {
-
- }
+ catch (Exception ex)
+ {
+ // Log the exception or handle it appropriately
+ throw;
+ } Committable suggestion
Suggested change
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
[TestMethod] | ||||||||||||||||||||||
public void ShouldReturnTwoCustomers() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
// Given | ||||||||||||||||||||||
Database db = new Database(); | ||||||||||||||||||||||
DatabaseOperations databaseOperations = new DatabaseOperations(db); | ||||||||||||||||||||||
db.DatabaseOperations = databaseOperations; | ||||||||||||||||||||||
db.DBType = Database.eDBTypes.Oracle; | ||||||||||||||||||||||
//ATT LS DB | ||||||||||||||||||||||
db.ConnectionString = _oracleContainer.GetConnectionString(); | ||||||||||||||||||||||
Boolean connectionSuccessful = db.DatabaseOperations.Connect(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
// When | ||||||||||||||||||||||
|
||||||||||||||||||||||
List<object> recs = new List<object>(); | ||||||||||||||||||||||
if (connectionSuccessful) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
|
||||||||||||||||||||||
string sqlQuery = "SELECT Id, Name FROM Customer"; | ||||||||||||||||||||||
recs = db.DatabaseOperations.FreeSQL(sqlQuery); | ||||||||||||||||||||||
|
||||||||||||||||||||||
db.DatabaseOperations.CloseConnection(); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
//then | ||||||||||||||||||||||
Assert.AreEqual(connectionSuccessful, true, "Connected Successfully to Oracle"); | ||||||||||||||||||||||
//Assert.IsNotNull(recs.Count, 0); | ||||||||||||||||||||||
Assert.AreEqual(recs.Count, 2, "Fetched 2 records from Oracle Table"); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,80 @@ | ||||||||||||||||||||||
using GingerCore.Environments; | ||||||||||||||||||||||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||||||||||||||||||||||
using Npgsql; | ||||||||||||||||||||||
using System; | ||||||||||||||||||||||
using System.Collections.Generic; | ||||||||||||||||||||||
using System.Threading.Tasks; | ||||||||||||||||||||||
using Testcontainers.PostgreSql; | ||||||||||||||||||||||
|
||||||||||||||||||||||
namespace GingerCoreNETUnitTest.DatabaseTest | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
[TestClass] | ||||||||||||||||||||||
public sealed class PostgreSqlIntegrationTests | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
private static readonly PostgreSqlContainer _postgres = new PostgreSqlBuilder() | ||||||||||||||||||||||
.WithImage("postgres:15-alpine") | ||||||||||||||||||||||
.Build(); | ||||||||||||||||||||||
Comment on lines
+14
to
+16
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The use of a hard-coded PostgreSQL image version ( - .WithImage("postgres:15-alpine")
+ .WithImage("postgres:latest") Committable suggestion
Suggested change
|
||||||||||||||||||||||
|
||||||||||||||||||||||
[ClassInitialize] | ||||||||||||||||||||||
public static async Task ClassInitialize(TestContext context) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
await _postgres.StartAsync(); | ||||||||||||||||||||||
Check failure on line 21 in Ginger/GingerCoreNETUnitTest/DatabaseTest/PostgreSqlIntegrationTests.cs
|
||||||||||||||||||||||
await CreateTestData(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
[TestCleanup] | ||||||||||||||||||||||
public Task DisposeAsync() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
return _postgres.DisposeAsync().AsTask(); | ||||||||||||||||||||||
Comment on lines
+26
to
+29
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The - public Task DisposeAsync()
+ public async Task DisposeAsync() Committable suggestion
Suggested change
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
public static async Task CreateTestData() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
using (var connection = new NpgsqlConnection(_postgres.GetConnectionString())) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
await connection.OpenAsync(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
// Create test data | ||||||||||||||||||||||
using (var command = connection.CreateCommand()) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
command.CommandText = "CREATE TABLE Customer (Id serial PRIMARY KEY, Name varchar(255));" + | ||||||||||||||||||||||
"INSERT INTO Customer (Name) VALUES ('1'), ('Mahesh kale');" + | ||||||||||||||||||||||
"INSERT INTO Customer (Name) VALUES ('1'), ('Jinendra Ghodke');"; | ||||||||||||||||||||||
Comment on lines
+40
to
+42
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The SQL command text concatenates strings to form a SQL query, which can be prone to SQL injection if dynamic data were ever to be included. Although this is a test environment setup, adopting best practices such as using parameterized queries is recommended to ensure security practices are followed consistently. - command.CommandText = "CREATE TABLE Customer (Id serial PRIMARY KEY, Name varchar(255));" +
- "INSERT INTO Customer (Name) VALUES ('1'), ('Mahesh kale');" +
- "INSERT INTO Customer (Name) VALUES ('1'), ('Jinendra Ghodke');";
+ command.CommandText = @"CREATE TABLE Customer (Id serial PRIMARY KEY, Name varchar(255));
+ INSERT INTO Customer (Name) VALUES (@Name1), (@Name2);
+ INSERT INTO Customer (Name) VALUES (@Name3), (@Name4);";
+ command.Parameters.AddWithValue("@Name1", "1");
+ command.Parameters.AddWithValue("@Name2", "Mahesh kale");
+ command.Parameters.AddWithValue("@Name3", "1");
+ command.Parameters.AddWithValue("@Name4", "Jinendra Ghodke"); Committable suggestion
Suggested change
|
||||||||||||||||||||||
await command.ExecuteNonQueryAsync(); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
[TestMethod] | ||||||||||||||||||||||
public void ShouldReturnTwoCustomers() | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
// Given | ||||||||||||||||||||||
Database db = new Database(); | ||||||||||||||||||||||
DatabaseOperations databaseOperations = new DatabaseOperations(db); | ||||||||||||||||||||||
db.DatabaseOperations = databaseOperations; | ||||||||||||||||||||||
db.DBType = Database.eDBTypes.PostgreSQL; | ||||||||||||||||||||||
//ATT LS DB | ||||||||||||||||||||||
db.ConnectionString = _postgres.GetConnectionString(); | ||||||||||||||||||||||
Boolean connectionSuccessful = db.DatabaseOperations.Connect(); | ||||||||||||||||||||||
|
||||||||||||||||||||||
|
||||||||||||||||||||||
// When | ||||||||||||||||||||||
|
||||||||||||||||||||||
List<object> recs = new List<object>(); | ||||||||||||||||||||||
if (connectionSuccessful) | ||||||||||||||||||||||
{ | ||||||||||||||||||||||
|
||||||||||||||||||||||
string sqlQuery = "SELECT Id, Name FROM Customer"; | ||||||||||||||||||||||
recs = db.DatabaseOperations.FreeSQL(sqlQuery); | ||||||||||||||||||||||
|
||||||||||||||||||||||
db.DatabaseOperations.CloseConnection(); | ||||||||||||||||||||||
} | ||||||||||||||||||||||
|
||||||||||||||||||||||
//then | ||||||||||||||||||||||
Assert.AreEqual(connectionSuccessful, true, "Connected Successfully to PostgreSQL"); | ||||||||||||||||||||||
//Assert.IsNotNull(recs.Count, 0); | ||||||||||||||||||||||
Assert.AreEqual(recs.Count,2, "Fetched 2 records from Postgre Table"); | ||||||||||||||||||||||
Comment on lines
+76
to
+77
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The comment |
||||||||||||||||||||||
} | ||||||||||||||||||||||
} | ||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instantiating the Couchbase container without specifying an image version could lead to inconsistent test environments. It's recommended to specify a version for predictability.
Committable suggestion