Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
c4309ed
start of jira work
JFriel Apr 28, 2025
488c68d
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
810ef90
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
ee5e39c
update provider
JFriel Apr 28, 2025
cb5c973
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
51b2855
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
a7cb487
add show
JFriel Apr 28, 2025
b925329
add working import
JFriel Apr 28, 2025
509af38
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
f272cea
fix build
JFriel Apr 28, 2025
b302055
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
e90b70c
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
602f351
add virtual url
JFriel Apr 28, 2025
102aee7
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
a0590c0
fix jira
JFriel Apr 28, 2025
e2681ae
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
2244111
working update
JFriel Apr 28, 2025
f2bc62c
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 28, 2025
fcb4570
fix mapping
JFriel Apr 29, 2025
b5034e7
fix tests
JFriel Apr 29, 2025
e614ffa
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 29, 2025
e9987ff
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 29, 2025
2cdc743
tidy up
JFriel Apr 29, 2025
21596f7
working update
JFriel Apr 29, 2025
df31249
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 29, 2025
fa057eb
fix update
JFriel Apr 29, 2025
613ba0a
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 29, 2025
960e84b
tidy up jira
JFriel Apr 29, 2025
b49c271
add tests
JFriel Apr 30, 2025
898e7b3
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Apr 30, 2025
0f9ede8
fix ovveride
JFriel Apr 30, 2025
c0a2771
fixups
JFriel May 1, 2025
65100fd
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel May 6, 2025
5c3850b
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel May 6, 2025
47efe8e
add url
JFriel May 6, 2025
b3d09d3
Merge branch 'task/RDMP-33-dataset-integration-interface' of https://…
JFriel Nov 5, 2025
16f8a70
use new type name
JFriel Nov 5, 2025
78331d4
update tests
JFriel Nov 6, 2025
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
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<PackageVersion Include="FluentFTP" Version="53.0.2" />
<PackageVersion Include="HIC.SynthEHR" Version="2.0.1" />
<PackageVersion Include="HIC.FAnsiSql" Version="3.2.7" />
<PackageVersion Include="JustEat.HttpClientInterception" Version="5.1.1" />
<PackageVersion Include="LibArchive.Net" Version="0.1.5" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.10" />
<PackageVersion Include="Microsoft.Net.Sdk.Compilers.Toolset" Version="9.0.300" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ public void TestImportInternalCataloguesOnly()
var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2");
_cata1.SaveToDatabase();
_cata2.SaveToDatabase();

var ext = new ExtractableDataSet(GetMockActivator().RepositoryLocator.DataExportRepository, _cata2);
ext.SaveToDatabase();
var configuration = new DatasetProviderConfiguration(GetMockActivator().RepositoryLocator.CatalogueRepository, "test", "test", "test",1,"test");
var provider = new InternalDatasetProvider(GetMockActivator(),configuration,null);
var cmd = new ExecuteCommandImportExistingCataloguesIntoExternalDatasetProvider(GetMockActivator(), provider, false,true, false, false,false);
Expand Down Expand Up @@ -52,7 +53,8 @@ public void TestImportDeprecatedCataloguesOnly()
var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2");
_cata1.SaveToDatabase();
_cata2.SaveToDatabase();

var ext = new ExtractableDataSet(GetMockActivator().RepositoryLocator.DataExportRepository, _cata2);
ext.SaveToDatabase();
var configuration = new DatasetProviderConfiguration(GetMockActivator().RepositoryLocator.CatalogueRepository, "test", "test", "test", 1, "test");
var provider = new InternalDatasetProvider(GetMockActivator(), configuration, null);
var cmd = new ExecuteCommandImportExistingCataloguesIntoExternalDatasetProvider(GetMockActivator(), provider, false, false, false, true, false);
Expand Down
334 changes: 334 additions & 0 deletions Rdmp.Core.Tests/Datasets/Jira/JiraDatasetProviderTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,334 @@
using Amazon.Runtime.Internal.Endpoints.StandardLibrary;
using JustEat.HttpClientInterception;
using NUnit.Framework;
using Org.BouncyCastle.Asn1.X509;
using Rdmp.Core.CommandExecution;
using Rdmp.Core.Curation.Data;
using Rdmp.Core.Curation.Data.Datasets;
using Rdmp.Core.Curation.Data.Datasets.Jira;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using Tests.Common;
using static System.Net.WebRequestMethods;

namespace Rdmp.Core.Tests.Datasets.Jira;

class JiraDatasetProviderTests : DatabaseTests
{

private DatasetProviderConfiguration _configuration;
private JiraDatasetProvider _provider;
private Catalogue _catalogue;
private HttpClient _mockHttp;
private HttpClientInterceptorOptions options = new HttpClientInterceptorOptions { ThrowOnMissingRegistration = true };

[TearDown]
public void OneTimeTeardown()
{
_mockHttp.Dispose();
}

[OneTimeSetUp]
public void OneTimeSetup()
{
var dataAccessCredentials = new DataAccessCredentials(CatalogueRepository, "name")
{
Username = "test",
Password = "test"
};
dataAccessCredentials.SaveToDatabase();

_configuration = new DatasetProviderConfiguration(CatalogueRepository, "Test Provider", typeof(JiraDatasetProvider).ToString(), "4", dataAccessCredentials.ID, "1234");

_configuration.SaveToDatabase();

_provider = new JiraDatasetProvider(new ThrowImmediatelyActivator(RepositoryLocator), _configuration, _mockHttp);
_catalogue = new Catalogue(CatalogueRepository, "Jira test Catalogue");
_catalogue.SaveToDatabase();

}

private void SetupHttpClient(HttpRequestInterceptionBuilder builder)
{
builder.RegisterWith(options);
_mockHttp = options.CreateHttpClient();
_provider = new JiraDatasetProvider(new ThrowImmediatelyActivator(RepositoryLocator), _configuration, _mockHttp);
}

[Test]
public void CreateProviderTest()
{
Assert.DoesNotThrow(() => _configuration.GetProviderInstance(new ThrowImmediatelyActivator(RepositoryLocator)));
}

//AddExistingDataset
[Test]
public void AddExistingDatasetTest_Success()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);
string name = "AddExistingDatasetTest_Success";
Assert.DoesNotThrow(() => _provider.AddExistingDataset(name, url));
var dataset = CatalogueRepository.GetAllObjects<Rdmp.Core.Curation.Data.Datasets.Dataset>().FirstOrDefault(d => d.Name == name);
Assert.That(dataset, Is.Not.Null);
dataset.DeleteInDatabase();
}
[Test]
public void AddExistingDatasetTest_BadRemote()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);
string name = "AddExistingDatasetTest_BadRemote";
Assert.Throws<Exception>(() => _provider.AddExistingDataset(name, url));
var dataset = CatalogueRepository.GetAllObjects<Rdmp.Core.Curation.Data.Datasets.Dataset>().FirstOrDefault(d => d.Name == name);
Assert.That(dataset, Is.Null);
}
//AddExistingDatasetWithReturn
[Test]
public void AddExistingDatasetWithReturnTest_Success()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);
string name = "AddExistingDatasetWithReturnTest_Success";
Assert.DoesNotThrow(() => _provider.AddExistingDatasetWithReturn(name, url));
var dataset = CatalogueRepository.GetAllObjects<Rdmp.Core.Curation.Data.Datasets.Dataset>().FirstOrDefault(d => d.Name == name);
Assert.That(dataset, Is.Not.Null);
dataset.DeleteInDatabase();
}
[Test]
public void AddExistingDatasetWithReturnTest_BadRemote()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);
string name = "AddExistingDatasetWithReturnTest_BadRemote";
Assert.Throws<Exception>(() => _provider.AddExistingDatasetWithReturn(name, url));
var dataset = CatalogueRepository.GetAllObjects<Rdmp.Core.Curation.Data.Datasets.Dataset>().FirstOrDefault(d => d.Name == name);
Assert.That(dataset, Is.Null);
}

[Test]
public void CreateDataset_BadObjectType()
{
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objectschema/4/objecttypes")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForPost()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/create")
.Responds()
.WithStatus(201).WithJsonContent(SucessCreateString);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests().ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objecttype/1/attributes")
.Responds()
.WithStatus(200).WithJsonContent(SuccessObjectTypeAttributes);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/999")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);

var catalogue = new Catalogue(CatalogueRepository, "CreateDataset_Success");
catalogue.SaveToDatabase();
var e = Assert.Throws<Exception>(() => _provider.Create(catalogue));
Assert.That(e.Message, Is.EqualTo("BadRequest: Unable to fetch Object Types"));
}

[Test]
public void CreateDataset_UnableToCreate()
{
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objectschema/4/objecttypes")
.Responds()
.WithStatus(200).WithJsonContent(SucessObjectTypesString);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForPost()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/create")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests().ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objecttype/1/attributes")
.Responds()
.WithStatus(200).WithJsonContent(SuccessObjectTypeAttributes);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/999")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);

var catalogue = new Catalogue(CatalogueRepository, "CreateDataset_Success");
catalogue.SaveToDatabase();
var e = Assert.Throws<Exception>(() => _provider.Create(catalogue));
Assert.That(e.Message, Is.EqualTo("BadRequest: Unable to create Dataset"));
}

[Test]
public void CreateDataset_NoMatchingSchema()
{
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objectschema/4/objecttypes")
.Responds()
.WithStatus(200).WithJsonContent(SucessObjectTypesString);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForPost()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/create")
.Responds()
.WithStatus(201).WithJsonContent(SucessCreateString);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests().ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/objecttype/1/attributes")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);

builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/999")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);

var catalogue = new Catalogue(CatalogueRepository, "CreateDataset_Success");
catalogue.SaveToDatabase();
var e = Assert.Throws<Exception>(() => _provider.Create(catalogue));
Assert.That(e.Message, Is.EqualTo("BadRequest: Unable to fetch Object Attributes for Schema 4"));
}
//FetchDatasetByID
[Test]
public void FetchDatasetByIDTest_Success()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(200).WithJsonContent(SucessResponseString);
SetupHttpClient(builder);
Assert.DoesNotThrow(() => _provider.FetchDatasetByID(int.Parse(url)));
}
[Test]
public void FetchDatasetByIDTest_BadRemote()
{
var url = "999";
var builder = new HttpRequestInterceptionBuilder()
.Requests()
.ForHttps()
.ForHost("api.atlassian.com/jsm/assets/workspace")
.ForPath($"/1234/v1/object/{url}")
.Responds()
.WithStatus(400);
SetupHttpClient(builder);
Assert.Throws<Exception>(() => _provider.FetchDatasetByID(int.Parse(url)));
}

private object SucessResponseString = new
{
id = "22",
name = "AddExistingDatasetWithReturnTest_Success",
type = "Dataset",
url = "22",
source = "Jira",
_links = new
{
self = "https://api.atlassian.com/jsm/assets/workspace/1234/v1/object/22",
}
};

private object SucessCreateString = new
{

};

private List<object> SucessObjectTypesString = [new { name = "Dataset", id = 1, objectSchemaId = 4 }];

private List<object> SuccessObjectTypeAttributes = [
new {name="Name",id=2 }
];

private object SucessAQLResult = new
{
values = new List<object>()
};
}



1 change: 1 addition & 0 deletions Rdmp.Core.Tests/Rdmp.Core.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="JustEat.HttpClientInterception" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Minio" />
<PackageReference Include="NSubstitute" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public override void Execute()
foreach (var catalogue in catalogues)
{
var dataset = _provider.Create(catalogue);

var ds = _provider.AddExistingDatasetWithReturn(null, dataset.GetID());
var cmd = new ExecuteCommandLinkCatalogueToDataset(_activator, catalogue, ds,_autoUpdate);
cmd.Execute();
Expand Down
2 changes: 2 additions & 0 deletions Rdmp.Core/Curation/Data/Datasets/IDataset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,13 @@ public interface IDataset: IMapsDirectlyToDatabaseTable
/// </summary>
string Type { get; }


/// <summary>
/// The URL to access the dataset
/// </summary>
string Url { get; }

public abstract string GetID();
public abstract string GetRemoteID();

}
Loading
Loading