Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 0 additions & 97 deletions .github/workflows/dotnet.yml

This file was deleted.

73 changes: 42 additions & 31 deletions .github/workflows/dotnetpull.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
name: .NET Pull Request

on:
push:
branches: [master]
pull_request:
branches: [ master ]
branches: [master]

jobs:
build:

runs-on: ubuntu-latest

services:
Expand Down Expand Up @@ -42,9 +43,7 @@ jobs:
ports:
- 1521:1521
env:
ORACLE_RANDOM_PASSWORD: true
APP_USER: test
APP_USER_PASSWORD: test
ORACLE_PASSWORD: adfkweflajdfglkj
options: >-
--health-cmd healthcheck.sh
--health-interval 10s
Expand All @@ -67,29 +66,41 @@ jobs:
--health-retries=10

steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
9.0.x
- name: Install SQLCMD tools
run: |
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
- name: Create SQLServer database
run: |
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -Q "CREATE DATABASE [Whatever];"
- name: Restore dependencies
run: |
dotnet restore Migrator.slnx
- name: Build
run: |
dotnet build Migrator.slnx
- name: Test
run: |
dotnet test Migrator.slnx
- uses: actions/checkout@v4
- uses: gvenzl/setup-oracle-sqlcl@v1
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
9.0.x
- name: Install SQLCMD tools
run: |
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y mssql-tools unixodbc-dev
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc
- name: Create SQLServer database
run: |
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -Q "CREATE DATABASE [Whatever];"
- name: Create Oracle user
run: |
sql sys/adfkweflajdfglkj@localhost/FREEPDB1 as sysdba <<EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
SET ECHO ON
SET FEEDBACK ON
SET SERVEROUTPUT ON
@.github/workflows/sql/oracle.sql
EXIT;
EOF

- name: Restore dependencies
run: |
dotnet restore Migrator.slnx
- name: Build
run: |
dotnet build Migrator.slnx
- name: Test
run: |
dotnet test Migrator.slnx
33 changes: 33 additions & 0 deletions .github/workflows/sql/oracle.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
WHENEVER SQLERROR EXIT SQL.SQLCODE

alter session set container = freepdb1;

create user k identified by k;

grant
create user
to k;

grant
drop user
to k;

grant
create session
to k with admin option;

grant resource to k with admin option;

grant connect to k with admin option;

grant
unlimited tablespace
to k with admin option;

grant select on v_$session to k with grant option

grant
alter system
to k

exit;
36 changes: 36 additions & 0 deletions src/Migrator.Tests/Database/DatabaseIntegrationTestServiceBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Migrator.Tests.Database.DatabaseName.Interfaces;
using Migrator.Tests.Database.Interfaces;
using Migrator.Tests.Database.Models;
using Migrator.Tests.Settings.Models;

namespace Migrator.Tests.Database;

public abstract class DatabaseIntegrationTestServiceBase(IDatabaseNameService databaseNameService) : IDatabaseIntegrationTestService
{
/// <summary>
/// Deletes all integration test databases older than the given time span.
/// </summary>
// TODO CK time span!
protected readonly TimeSpan MinTimeSpanBeforeDatabaseDeletion = TimeSpan.FromMinutes(1); // TimeSpan.FromMinutes(60);

protected IDatabaseNameService DatabaseNameService { get; private set; } = databaseNameService;

abstract public Task<DatabaseInfo> CreateTestDatabaseAsync(DatabaseConnectionConfig databaseConnectionConfig, CancellationToken cancellationToken);

abstract public Task DropDatabaseAsync(DatabaseInfo databaseInfo, CancellationToken cancellationToken);

protected DateTime ReadTimeStampFromDatabaseName(string name)
{
var creationDate = DatabaseNameService.ReadTimeStampFromString(name);

if (!creationDate.HasValue)
{
throw new Exception("You tried to drop a database that was not created by this service. For safety reasons we deny your request.");
}

return creationDate.Value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using DryIoc;
using Migrator.Tests.Database.Interfaces;

namespace Migrator.Tests.Database;

public class DatabaseIntegrationTestServiceFactory(IResolver resolver) : IDatabaseIntegrationTestServiceFactory
{
public IDatabaseIntegrationTestService Create(DatabaseProviderType providerType)
{
return resolver.Resolve<IDatabaseIntegrationTestService>(serviceKey: providerType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Migrator.Tests.Database.DatabaseName.Interfaces;
using Migrator.Tests.Database.GuidServices.Interfaces;
using Migrator.Tests.Database.GuidServices;
using Migrator.Tests.Database.Interfaces;
using Migrator.Tests.Database.DerivedDatabaseIntegrationTestServices;
using System;
using DryIoc;
using Migrator.Test.Shared.Database;
using Migrator.Tests.Settings.Interfaces;
using Migrator.Tests.Settings;

namespace Migrator.Tests.Database;

public static class DatabaseCreationServiceRegistry
{
public static void RegisterDatabaseIntegrationTestService(this IRegistrator container)
{
container.Register<IDatabaseIntegrationTestServiceFactory, DatabaseIntegrationTestServiceFactory>(reuse: Reuse.Transient);
container.Register<IDatabaseNameService, DatabaseNameService>(reuse: Reuse.Transient);
container.RegisterInstance(TimeProvider.System, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
container.Register<IGuidService, GuidService>(reuse: Reuse.Transient, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
container.Register<IDatabaseIntegrationTestService, OracleDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.Oracle);
container.Register<IDatabaseIntegrationTestService, SQLiteDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.SQLite);
container.Register<IDatabaseIntegrationTestService, PostgreSqlDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.Postgres);
container.Register<IDatabaseIntegrationTestService, SqlServerDatabaseIntegrationTestService>(serviceKey: DatabaseProviderType.SQLServer);
container.Register<IConfigurationReader, ConfigurationReader>(reuse: Reuse.Singleton, ifAlreadyRegistered: IfAlreadyRegistered.Keep);
}
}
46 changes: 46 additions & 0 deletions src/Migrator.Tests/Database/DatabaseName/DatabaseNameService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Migrator.Tests.Database.DatabaseName.Interfaces;
using Migrator.Tests.Database.GuidServices.Interfaces;

namespace Migrator.Test.Shared.Database;

public partial class DatabaseNameService(TimeProvider timeProvider, IGuidService guidService) : IDatabaseNameService
{
private const string TestDatabaseString = "Test";
private const string TimeStampPattern = "yyyyMMddHHmmssfff";

public DateTime? ReadTimeStampFromString(string name)
{
name = Path.GetFileNameWithoutExtension(name);

var regex = DateTimeRegex();
var match = regex.Match(name);

if (match.Success && DateTime.TryParseExact(match.Value, TimeStampPattern, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var res))
{
return res;
}

return null;
}

public string CreateDatabaseName()
{
var dateTimePattern = timeProvider.GetUtcNow()
.ToString(TimeStampPattern);

var randomString = string.Concat(guidService.NewGuid()
.ToString("N")
.Reverse()
.Take(9));

return $"{dateTimePattern}{TestDatabaseString}{randomString}";
}

[GeneratedRegex(@"^(\d+)(?=Test.{9}$)")]
private static partial Regex DateTimeRegex();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System;

namespace Migrator.Tests.Database.DatabaseName.Interfaces;

/// <summary>
/// Used for integration tests. During integration tests we need to create unique database names for parallel testing.
/// </summary>
public interface IDatabaseNameService
{
/// <summary>
/// Reads the date time from the date part of the database or user name (in Oracle we use the user name/schema name).
/// </summary>
/// <param name="databaseName"></param>
/// <returns></returns>
DateTime? ReadTimeStampFromString(string name);

/// <summary>
/// Creates a database name
/// </summary>
/// <returns></returns>
string CreateDatabaseName();
}
Loading
Loading