using GitConverter.Lib.Converters;
using GitConverter.TestsApp.TestSupport;
namespace GitConverter.TestsApp.Converters
{
///
/// Integration tests for Shapefile conversion flows.
///
///
/// Purpose
/// - Exercise end-to-end shapefile conversion using the real ConversionService and ShapefileConverter
/// against small sample archives placed under TestData\Shapefile.
///
/// Behavior & expectations
/// - Tests are defensive: they skip when no TestData is present so CI remains non-fatal.
/// - For each sample archive the tests create an isolated temp output folder and temp extraction folder.
/// - On success the converter should produce one or more files in the output folder.
/// - On failure the converter should return a ConversionResult.Failure with a non-empty diagnostic message.
///
/// Implementation notes
/// - Uses IntegrationTestConstants.TestDataShapefileFolder to locate sample artifacts at runtime.
/// - Uses ConversionService.Run to exercise the high-level orchestrator (this calls into registered converters).
/// - Also exercises ShapefileConverter.Convert directly for a single extracted archive (if present).
/// - Cleanup: temporary folders are removed in Dispose / finally blocks where possible.
///
[Collection("Integration")]
public class ShapefileConverterIntegrationTests : IDisposable
{
private readonly string _root;
public ShapefileConverterIntegrationTests()
{
// Use a per-test temp root to avoid collisions across tests/runs
_root = Path.Combine(Path.GetTempPath(), "GitConverter.ShapefileTests", Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(_root);
}
public void Dispose()
{
try { if (Directory.Exists(_root)) Directory.Delete(_root, true); } catch { }
}
private static string TestDataShapefileFolder => IntegrationTestConstants.TestDataShapefileFolder;
[Fact(DisplayName = "ConversionService.Run processes shapefile archives (if present)")]
public void Run_ShapefileArchives_ProduceOutputs_WhenPresent()
{
if (!Directory.Exists(TestDataShapefileFolder))
{
// No samples provided; skip test.
return;
}
var samples = Directory.EnumerateFiles(TestDataShapefileFolder, "*", SearchOption.TopDirectoryOnly)
.Where(f => f.EndsWith(".7z", StringComparison.OrdinalIgnoreCase) || f.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
.ToList();
if (!samples.Any())
return;
foreach (var sample in samples)
{
var outDir = Path.Combine(_root, Path.GetFileNameWithoutExtension(sample) + "_out");
var tempDir = Path.Combine(_root, Path.GetFileNameWithoutExtension(sample) + "_tmp");
Directory.CreateDirectory(outDir);
Directory.CreateDirectory(tempDir);
try
{
var result = ConversionService.Run(sample, outDir, tempDir, factory: null);
Assert.NotNull(result);
if (result.IsSuccess)
{
Assert.True(Directory.Exists(outDir), $"Expected output folder '{outDir}' for '{sample}'.");
var files = Directory.EnumerateFiles(outDir, "*", SearchOption.AllDirectories).ToList();
Assert.True(files.Count > 0, $"Expected one or more output files in '{outDir}' for '{sample}'.");
}
else
{
// On failure ensure a diagnostic message is present
Assert.False(string.IsNullOrWhiteSpace(result.Message), $"Conversion failed for '{sample}' but produced no message.");
}
}
finally
{
try { if (Directory.Exists(outDir)) Directory.Delete(outDir, true); } catch { }
try { if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true); } catch { }
}
}
}
[Fact(DisplayName = "ShapefileConverter.Convert direct call against first archive (if present)")]
public void Convert_Archive_ToAllTargetOptions_WhenArchivePresent()
{
if (!Directory.Exists(TestDataShapefileFolder))
return;
var sample = Directory.EnumerateFiles(TestDataShapefileFolder, "*", SearchOption.TopDirectoryOnly)
.FirstOrDefault(f => f.EndsWith(".7z", StringComparison.OrdinalIgnoreCase) || f.EndsWith(".zip", StringComparison.OrdinalIgnoreCase));
if (sample == null) return;
var converter = new ShapefileConverter();
foreach (var target in IntegrationTestConstants.TargetOptions)
{
var outDir = Path.Combine(_root, $"{Path.GetFileNameWithoutExtension(sample)}_{target}_out");
var tempDir = Path.Combine(_root, $"{Path.GetFileNameWithoutExtension(sample)}_{target}_tmp");
Directory.CreateDirectory(outDir);
Directory.CreateDirectory(tempDir);
try
{
var result = converter.Convert(sample, target, outDir, tempDir);
Assert.NotNull(result);
if (result.IsSuccess)
{
var files = Directory.EnumerateFiles(outDir, "*", SearchOption.AllDirectories).ToList();
Assert.True(files.Count > 0, $"No output files produced for target '{target}' when converting '{sample}'.");
}
else
{
Assert.False(string.IsNullOrWhiteSpace(result.Message), $"Conversion to '{target}' failed with empty message ({sample}).");
}
}
finally
{
try { if (Directory.Exists(outDir)) Directory.Delete(outDir, true); } catch { }
try { if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true); } catch { }
}
}
}
}
}