Skip to content

Commit bd92837

Browse files
Merge pull request #84 from dotnetprojects/postgre-test-reactivation
GetForeignKeyConstraints
2 parents 072de29 + 72b9105 commit bd92837

File tree

40 files changed

+1407
-377
lines changed

40 files changed

+1407
-377
lines changed

.github/workflows/dotnet.yml

Lines changed: 0 additions & 97 deletions
This file was deleted.

.github/workflows/dotnetpull.yml

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
name: .NET Pull Request
22

33
on:
4+
push:
5+
branches: [master]
46
pull_request:
5-
branches: [ master ]
7+
branches: [master]
68

79
jobs:
810
build:
9-
1011
runs-on: ubuntu-latest
1112

1213
services:
@@ -42,9 +43,7 @@ jobs:
4243
ports:
4344
- 1521:1521
4445
env:
45-
ORACLE_RANDOM_PASSWORD: true
46-
APP_USER: test
47-
APP_USER_PASSWORD: test
46+
ORACLE_PASSWORD: adfkweflajdfglkj
4847
options: >-
4948
--health-cmd healthcheck.sh
5049
--health-interval 10s
@@ -67,29 +66,41 @@ jobs:
6766
--health-retries=10
6867
6968
steps:
70-
- uses: actions/checkout@v4
71-
- name: Setup .NET
72-
uses: actions/setup-dotnet@v4
73-
with:
74-
dotnet-version: |
75-
9.0.x
76-
- name: Install SQLCMD tools
77-
run: |
78-
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
79-
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
80-
sudo apt-get update
81-
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev
82-
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
83-
source ~/.bashrc
84-
- name: Create SQLServer database
85-
run: |
86-
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -Q "CREATE DATABASE [Whatever];"
87-
- name: Restore dependencies
88-
run: |
89-
dotnet restore Migrator.slnx
90-
- name: Build
91-
run: |
92-
dotnet build Migrator.slnx
93-
- name: Test
94-
run: |
95-
dotnet test Migrator.slnx
69+
- uses: actions/checkout@v4
70+
- uses: gvenzl/setup-oracle-sqlcl@v1
71+
- name: Setup .NET
72+
uses: actions/setup-dotnet@v4
73+
with:
74+
dotnet-version: |
75+
9.0.x
76+
- name: Install SQLCMD tools
77+
run: |
78+
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
79+
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
80+
sudo apt-get update
81+
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev
82+
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
83+
source ~/.bashrc
84+
- name: Create SQLServer database
85+
run: |
86+
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -Q "CREATE DATABASE [Whatever];"
87+
- name: Create Oracle user
88+
run: |
89+
sql sys/adfkweflajdfglkj@localhost/FREEPDB1 as sysdba <<EOF
90+
WHENEVER SQLERROR EXIT SQL.SQLCODE
91+
SET ECHO ON
92+
SET FEEDBACK ON
93+
SET SERVEROUTPUT ON
94+
@.github/workflows/sql/oracle.sql
95+
EXIT;
96+
EOF
97+
98+
- name: Restore dependencies
99+
run: |
100+
dotnet restore Migrator.slnx
101+
- name: Build
102+
run: |
103+
dotnet build Migrator.slnx
104+
- name: Test
105+
run: |
106+
dotnet test Migrator.slnx

.github/workflows/sql/oracle.sql

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
WHENEVER SQLERROR EXIT SQL.SQLCODE
2+
3+
alter session set container = freepdb1;
4+
5+
create user k identified by k;
6+
7+
grant
8+
create user
9+
to k;
10+
11+
grant
12+
drop user
13+
to k;
14+
15+
grant
16+
create session
17+
to k with admin option;
18+
19+
grant resource to k with admin option;
20+
21+
grant connect to k with admin option;
22+
23+
grant
24+
unlimited tablespace
25+
to k with admin option;
26+
27+
grant select on v_$session to k with grant option
28+
29+
grant
30+
alter system
31+
to k
32+
33+
exit;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Migrator.Tests.Database.DatabaseName.Interfaces;
5+
using Migrator.Tests.Database.Interfaces;
6+
using Migrator.Tests.Database.Models;
7+
using Migrator.Tests.Settings.Models;
8+
9+
namespace Migrator.Tests.Database;
10+
11+
public abstract class DatabaseIntegrationTestServiceBase(IDatabaseNameService databaseNameService) : IDatabaseIntegrationTestService
12+
{
13+
/// <summary>
14+
/// Deletes all integration test databases older than the given time span.
15+
/// </summary>
16+
// TODO CK time span!
17+
protected readonly TimeSpan MinTimeSpanBeforeDatabaseDeletion = TimeSpan.FromMinutes(1); // TimeSpan.FromMinutes(60);
18+
19+
protected IDatabaseNameService DatabaseNameService { get; private set; } = databaseNameService;
20+
21+
abstract public Task<DatabaseInfo> CreateTestDatabaseAsync(DatabaseConnectionConfig databaseConnectionConfig, CancellationToken cancellationToken);
22+
23+
abstract public Task DropDatabaseAsync(DatabaseInfo databaseInfo, CancellationToken cancellationToken);
24+
25+
protected DateTime ReadTimeStampFromDatabaseName(string name)
26+
{
27+
var creationDate = DatabaseNameService.ReadTimeStampFromString(name);
28+
29+
if (!creationDate.HasValue)
30+
{
31+
throw new Exception("You tried to drop a database that was not created by this service. For safety reasons we deny your request.");
32+
}
33+
34+
return creationDate.Value;
35+
}
36+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using DryIoc;
2+
using Migrator.Tests.Database.Interfaces;
3+
4+
namespace Migrator.Tests.Database;
5+
6+
public class DatabaseIntegrationTestServiceFactory(IResolver resolver) : IDatabaseIntegrationTestServiceFactory
7+
{
8+
public IDatabaseIntegrationTestService Create(DatabaseProviderType providerType)
9+
{
10+
return resolver.Resolve<IDatabaseIntegrationTestService>(serviceKey: providerType);
11+
}
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Migrator.Tests.Database.DatabaseName.Interfaces;
2+
using Migrator.Tests.Database.GuidServices.Interfaces;
3+
using Migrator.Tests.Database.GuidServices;
4+
using Migrator.Tests.Database.Interfaces;
5+
using Migrator.Tests.Database.DerivedDatabaseIntegrationTestServices;
6+
using System;
7+
using DryIoc;
8+
using Migrator.Test.Shared.Database;
9+
using Migrator.Tests.Settings.Interfaces;
10+
using Migrator.Tests.Settings;
11+
12+
namespace Migrator.Tests.Database;
13+
14+
public static class DatabaseCreationServiceRegistry
15+
{
16+
public static void RegisterDatabaseIntegrationTestService(this IRegistrator container)
17+
{
18+
container.Register<IDatabaseIntegrationTestServiceFactory, DatabaseIntegrationTestServiceFactory>(reuse: Reuse.Transient);
19+
container.Register<IDatabaseNameService, DatabaseNameService>(reuse: Reuse.Transient);
20+
container.RegisterInstance(TimeProvider.System, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
21+
container.Register<IGuidService, GuidService>(reuse: Reuse.Transient, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
22+
container.Register<IDatabaseIntegrationTestService, OracleDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.Oracle);
23+
container.Register<IDatabaseIntegrationTestService, SQLiteDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.SQLite);
24+
container.Register<IDatabaseIntegrationTestService, PostgreSqlDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.Postgres);
25+
container.Register<IDatabaseIntegrationTestService, SqlServerDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.SQLServer);
26+
container.Register<IConfigurationReader, ConfigurationReader>(reuse: Reuse.Singleton, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
27+
}
28+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Globalization;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Text.RegularExpressions;
6+
using Migrator.Tests.Database.DatabaseName.Interfaces;
7+
using Migrator.Tests.Database.GuidServices.Interfaces;
8+
9+
namespace Migrator.Test.Shared.Database;
10+
11+
public partial class DatabaseNameService(TimeProvider timeProvider, IGuidService guidService) : IDatabaseNameService
12+
{
13+
private const string TestDatabaseString = "Test";
14+
private const string TimeStampPattern = "yyyyMMddHHmmssfff";
15+
16+
public DateTime? ReadTimeStampFromString(string name)
17+
{
18+
name = Path.GetFileNameWithoutExtension(name);
19+
20+
var regex = DateTimeRegex();
21+
var match = regex.Match(name);
22+
23+
if (match.Success && DateTime.TryParseExact(match.Value, TimeStampPattern, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var res))
24+
{
25+
return res;
26+
}
27+
28+
return null;
29+
}
30+
31+
public string CreateDatabaseName()
32+
{
33+
var dateTimePattern = timeProvider.GetUtcNow()
34+
.ToString(TimeStampPattern);
35+
36+
var randomString = string.Concat(guidService.NewGuid()
37+
.ToString("N")
38+
.Reverse()
39+
.Take(9));
40+
41+
return $"{dateTimePattern}{TestDatabaseString}{randomString}";
42+
}
43+
44+
[GeneratedRegex(@"^(\d+)(?=Test.{9}$)")]
45+
private static partial Regex DateTimeRegex();
46+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
3+
namespace Migrator.Tests.Database.DatabaseName.Interfaces;
4+
5+
/// <summary>
6+
/// Used for integration tests. During integration tests we need to create unique database names for parallel testing.
7+
/// </summary>
8+
public interface IDatabaseNameService
9+
{
10+
/// <summary>
11+
/// Reads the date time from the date part of the database or user name (in Oracle we use the user name/schema name).
12+
/// </summary>
13+
/// <param name="databaseName"></param>
14+
/// <returns></returns>
15+
DateTime? ReadTimeStampFromString(string name);
16+
17+
/// <summary>
18+
/// Creates a database name
19+
/// </summary>
20+
/// <returns></returns>
21+
string CreateDatabaseName();
22+
}

0 commit comments

Comments
 (0)