/
d3h5
/
Unistream.TestTask
Обзор
Документация
Войти
/
d3h5
/
Unistream.TestTask
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Unistream.TestTask.Tests/TransientContext/Postgresql/TestDatabase.cs
68 строк
2 KB
WORKSTATION-H\mrthe
Первый залив
03 июн 2025, 11:20
03 июн 2025, 11:20
33c9164
Код
Авторство
О чём код?
using System.Text; using Unistream.TestTask.Tests.TransientContext.Common; namespace Grimtod.Articles.Tests.TransientContext.Postgresql; public class TestDatabase(IConnectionStringManager connectionStringManager, IDatabaseNameGenerator databaseNameGenerator, IConnection connection) : ITestDatabase { public string ConnectionString { get; private set; } = string.Empty; public string TemplateDatabase { get; set; } = string.Empty; private readonly IConnectionStringManager _connectionStringManager = connectionStringManager; private readonly IDatabaseNameGenerator _databaseNameGenerator = databaseNameGenerator; private readonly IConnection _connection = connection; private string _createdDatabaseName = string.Empty; public void Create() { _createdDatabaseName = _databaseNameGenerator.Generate(); _connectionStringManager.SetCreatedDatabaseName(_createdDatabaseName); ConnectionString = _connectionStringManager.CreatedDatabase; _connection.Execute(_connectionStringManager.Default, BuildCreateStatement()); } private string BuildCreateStatement() { var stringBuilder = new StringBuilder($"create database {_createdDatabaseName}"); if (!string.IsNullOrWhiteSpace(TemplateDatabase)) { _ = stringBuilder.Append($" template {TemplateDatabase}"); } _ = stringBuilder.Append(';'); return stringBuilder.ToString(); } public void RunScripts(string scriptFolderPath) { if (!Directory.Exists(scriptFolderPath)) { throw new ArgumentException($"Directory does not exist: {scriptFolderPath}"); } Directory.GetFiles(scriptFolderPath) .OrderBy(s => s) .Select(File.ReadAllText) .ToList() .ForEach(command => _connection.Execute(_connectionStringManager.CreatedDatabase, command)); } public void Drop() { _connection.Execute(_connectionStringManager.Default, $"select pid, pg_terminate_backend(pid) from pg_stat_activity where datname = '{_createdDatabaseName}' and pid <> pg_backend_pid();"); _connection.Execute(_connectionStringManager.Default, $"drop database {_createdDatabaseName}"); } public bool Exists() { _connection.ExecuteReader(_connectionStringManager.Default, $"select 1 as result from pg_database where datname = '{_createdDatabaseName}'", out int rows); return rows > 0; } }