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
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public void GetCourseAdminFields_returns_populated_CourseAdminFieldsResult()
);

// When
var returnedCourseAdminFieldsResult = courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0);
var returnedCourseAdminFieldsResult = courseAdminFieldsDataService.GetCourseAdminFields(100, 101);

// Then
returnedCourseAdminFieldsResult.Should().BeEquivalentTo(expectedCourseAdminFieldsResult);
Expand All @@ -52,7 +52,7 @@ public void UpdateCustomPromptForCourse_correctly_updates_custom_prompt()

// When
courseAdminFieldsDataService.UpdateCustomPromptForCourse(100, 1, 1, options);
var courseAdminFields = courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0);
var courseAdminFields = courseAdminFieldsDataService.GetCourseAdminFields(100, 101);

// Then
using (new AssertionScope())
Expand Down Expand Up @@ -87,7 +87,7 @@ public void UpdateCustomPromptForCourse_correctly_adds_custom_prompt()

// When
courseAdminFieldsDataService.UpdateCustomPromptForCourse(100, 3, 1, options);
var courseCustomPrompts = courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 2);
var courseCustomPrompts = courseAdminFieldsDataService.GetCourseAdminFields(100, 101);
var customPrompt = courseAdminFieldsDataService.GetCoursePromptsAlphabetical()
.Single(c => c.id == 1)
.name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace DigitalLearningSolutions.Data.Tests.DataServices
using DigitalLearningSolutions.Data.Tests.TestHelpers;
using FakeItEasy;
using FluentAssertions;
using FluentAssertions.Execution;
using Microsoft.Extensions.Logging;
using NUnit.Framework;

Expand Down Expand Up @@ -364,5 +363,35 @@ public void GetCentrallyManagedAndCentreCourses_returns_expected_values()
result.Should().HaveCount(260);
result.First().Should().BeEquivalentTo(expectedFirstCourse);
}

[Test]
public void DoesCourseExistAtCentre_returns_true_if_course_exists()
{
// When
var result = courseDataService.DoesCourseExistAtCentre(100, 101, null);

// Then
result.Should().BeTrue();
}

[Test]
public void DoesCourseExistAtCentre_returns_false_if_course_does_not_exist_at_centre()
{
// When
var result = courseDataService.DoesCourseExistAtCentre(100, 2, 0);

// Then
result.Should().BeFalse();
}

[Test]
public void DoesCourseExistAtCentre_returns_false_if_course_does_not_exist_with_categoryId()
{
// When
var result = courseDataService.DoesCourseExistAtCentre(100, 101, 99);

// Then
result.Should().BeFalse();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ public void GetCustomPromptsForCourse_Returns_Populated_CourseAdminFields()
var expectedPrompt2 = CustomPromptsTestHelper.GetDefaultCustomPrompt(2, "Priority Access");
var customPrompts = new List<CustomPrompt> { expectedPrompt1, expectedPrompt2 };
var expectedCourseAdminFields = CustomPromptsTestHelper.GetDefaultCourseAdminFields(customPrompts);
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0))
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101))
.Returns(CustomPromptsTestHelper.GetDefaultCourseAdminFieldsResult());

// When
var result = courseAdminFieldsService.GetCustomPromptsForCourse(100, 101, 0);
var result = courseAdminFieldsService.GetCustomPromptsForCourse(100, 101);

// Then
result.Should().BeEquivalentTo(expectedCourseAdminFields);
Expand All @@ -63,7 +63,7 @@ public void GetCustomPromptsWithAnswersForCourse_Returns_Populated_List_of_Custo
answer: answer2
);
var expected = new List<CustomPromptWithAnswer> { expected1, expected2 };
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0))
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101))
.Returns(CustomPromptsTestHelper.GetDefaultCourseAdminFieldsResult());
var delegateCourseInfo = new DelegateCourseInfo { Answer1 = answer1, Answer2 = answer2 };

Expand Down Expand Up @@ -112,11 +112,11 @@ public void AddCustomPromptToCourse_adds_prompt_to_course_at_next_prompt_number(
(
() => courseAdminFieldsDataService.UpdateCustomPromptForCourse(100, A<int>._, A<int>._, null)
).DoesNothing();
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0))
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101))
.Returns(CustomPromptsTestHelper.GetDefaultCourseAdminFieldsResult());

// When
var result = courseAdminFieldsService.AddCustomPromptToCourse(100, 101, 0, 3, null);
var result = courseAdminFieldsService.AddCustomPromptToCourse(100, 101, 3, null);

// Then
A.CallTo
Expand All @@ -134,7 +134,7 @@ public void AddCustomPromptToCourse_does_not_add_prompt_if_course_has_all_prompt
(
() => courseAdminFieldsDataService.UpdateCustomPromptForCourse(100, A<int>._, A<int>._, null)
).DoesNothing();
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101, 0))
A.CallTo(() => courseAdminFieldsDataService.GetCourseAdminFields(100, 101))
.Returns(
CustomPromptsTestHelper.GetDefaultCourseAdminFieldsResult(
"System Access Granted",
Expand All @@ -149,7 +149,6 @@ public void AddCustomPromptToCourse_does_not_add_prompt_if_course_has_all_prompt
var result = courseAdminFieldsService.AddCustomPromptToCourse(
100,
101,
0,
3,
"Adding a fourth prompt"
);
Expand Down
38 changes: 34 additions & 4 deletions DigitalLearningSolutions.Data.Tests/Services/CourseServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ public void GetAllCoursesForDelegate_should_call_correct_data_service_and_helper
() => courseAdminFieldsService.GetCustomPromptsWithAnswersForCourse(
info,
customisationId,
CentreId,
0
CentreId
)
).MustHaveHappened(1, Times.Exactly);
A.CallTo(() => courseDataService.GetDelegateCourseAttemptStats(delegateId, customisationId))
Expand Down Expand Up @@ -140,14 +139,45 @@ public void GetAllCoursesForDelegate_should_not_fetch_attempt_stats_if_course_no
() => courseAdminFieldsService.GetCustomPromptsWithAnswersForCourse(
info,
customisationId,
CentreId,
0
CentreId
)
).MustHaveHappened(1, Times.Exactly);
A.CallTo(() => courseDataService.GetDelegateCourseAttemptStats(A<int>._, A<int>._)).MustNotHaveHappened();
results.Should().HaveCount(1);
results[0].DelegateCourseInfo.Should().BeEquivalentTo(info);
results[0].AttemptStats.Should().Be((0, 0));
}

[Test]
public void VerifyAdminUserCanAccessCourse_should_call_correct_data_service_method()
{
// Given
A.CallTo(() => courseDataService.DoesCourseExistAtCentre(A<int>._, A<int>._, A<int>._))
.Returns(true);

// When
var result = courseService.VerifyAdminUserCanAccessCourse(1, 2, 2);

// Then
A.CallTo(() => courseDataService.DoesCourseExistAtCentre(A<int>._, A<int>._, A<int>._))
.MustHaveHappened(1, Times.Exactly);
result.Should().BeTrue();
}

[Test]
public void VerifyAdminUserCanAccessCourse_should_return_return_false_with_incorrect_ids()
{
// Given
A.CallTo(() => courseDataService.DoesCourseExistAtCentre(A<int>._, A<int>._, A<int>._))
.Returns(false);

// When
var result = courseService.VerifyAdminUserCanAccessCourse(1, 1, 1);

// Then
A.CallTo(() => courseDataService.DoesCourseExistAtCentre(A<int>._, A<int>._, A<int>._))
.MustHaveHappened(1, Times.Exactly);
result.Should().BeFalse();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

public interface ICourseAdminFieldsDataService
{
CourseAdminFieldsResult? GetCourseAdminFields(int customisationId, int centreId, int categoryId);
CourseAdminFieldsResult? GetCourseAdminFields(int customisationId, int centreId);

void UpdateCustomPromptForCourse(int customisationId, int promptNumber, string? options);

Expand Down Expand Up @@ -37,7 +37,7 @@ public CourseAdminFieldsDataService(IDbConnection connection)
this.connection = connection;
}

public CourseAdminFieldsResult GetCourseAdminFields(int customisationId, int centreId, int categoryId)
public CourseAdminFieldsResult GetCourseAdminFields(int customisationId, int centreId)
{
var result = connection.Query<CourseAdminFieldsResult>(
@"SELECT
Expand All @@ -63,7 +63,7 @@ LEFT JOIN CoursePrompts AS cp3
WHERE cu.CentreID = @centreId
AND ap.ArchivedDate IS NULL
AND cu.CustomisationID = @customisationId",
new { customisationId, centreId, categoryId }
new { customisationId, centreId }
).Single();

return result;
Expand Down
34 changes: 26 additions & 8 deletions DigitalLearningSolutions.Data/DataServices/CourseDataService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,23 @@ public interface ICourseDataService
CourseNameInfo? GetCourseNameAndApplication(int customisationId);
CourseDetails? GetCourseDetailsForAdminCategoryId(int customisationId, int centreId, int categoryId);
IEnumerable<Course> GetCentrallyManagedAndCentreCourses(int centreId, int? categoryId);
bool DoesCourseExistAtCentre(int customisationId, int centreId, int? categoryId);
}

public class CourseDataService : ICourseDataService
{
private const string DelegateCountQuery =
@"(SELECT COUNT(pr.CandidateID)
FROM dbo.Progress AS pr
INNER JOIN dbo.Candidates AS can ON can.CandidateID = pr.CandidateID
INNER JOIN dbo.Candidates AS can ON can.CandidateID = pr.CandidateID
WHERE pr.CustomisationID = cu.CustomisationID
AND can.CentreID = @centreId
AND RemovedDate IS NULL) AS DelegateCount";

private const string CompletedCountQuery =
@"(SELECT COUNT(pr.CandidateID)
FROM dbo.Progress AS pr
INNER JOIN dbo.Candidates AS can ON can.CandidateID = pr.CandidateID
INNER JOIN dbo.Candidates AS can ON can.CandidateID = pr.CandidateID
WHERE pr.CustomisationID = cu.CustomisationID AND pr.Completed IS NOT NULL
AND can.CentreID = @centreId) AS CompletedCount";

Expand Down Expand Up @@ -167,7 +168,7 @@ public int GetNumberOfActiveCoursesAtCentreForCategory(int centreId, int adminCa
@"SELECT COUNT(*)
FROM Customisations AS c
JOIN Applications AS a on a.ApplicationID = c.ApplicationID
WHERE Active = 1 AND CentreID = @centreId
WHERE Active = 1 AND CentreID = @centreId
AND (a.CourseCategoryID = @adminCategoryId OR @adminCategoryId = 0)",
new { centreId, adminCategoryId }
);
Expand Down Expand Up @@ -199,7 +200,7 @@ FROM dbo.Customisations AS cu
INNER JOIN dbo.Applications AS ap ON ap.ApplicationID = ca.ApplicationID
INNER JOIN dbo.CourseCategories AS cc ON cc.CourseCategoryID = ap.CourseCategoryID
INNER JOIN dbo.CourseTopics AS ct ON ct.CourseTopicID = ap.CourseTopicId
WHERE (ap.CourseCategoryID = @categoryId OR @categoryId = 0)
WHERE (ap.CourseCategoryID = @categoryId OR @categoryId = 0)
AND (cu.CentreID = @centreId OR (cu.AllCentres = 1 AND ca.Active = 1))
AND ca.CentreID = @centreId
AND ap.ArchivedDate IS NULL",
Expand Down Expand Up @@ -298,9 +299,9 @@ FROM dbo.Customisations AS cu
LEFT JOIN dbo.Customisations AS refreshToCu ON refreshToCu.CustomisationID = cu.RefreshToCustomisationId
LEFT JOIN dbo.Applications AS refreshToAp ON refreshToAp.ApplicationID = refreshToCu.ApplicationID
WHERE
(ap.CourseCategoryID = @categoryId OR @categoryId = 0)
(ap.CourseCategoryID = @categoryId OR @categoryId = 0)
AND cu.CentreID = @centreId
AND ap.ArchivedDate IS NULL
AND ap.ArchivedDate IS NULL
AND cu.CustomisationID = @customisationId",
new { customisationId, centreId, categoryId }
).FirstOrDefault();
Expand All @@ -309,9 +310,9 @@ AND ap.ArchivedDate IS NULL
public CourseNameInfo? GetCourseNameAndApplication(int customisationId)
{
var names = connection.QueryFirstOrDefault<CourseNameInfo>(
@"SELECT cu.CustomisationId, cu.CustomisationName, ap.ApplicationName
@"SELECT cu.CustomisationName, ap.ApplicationName
FROM Customisations cu
JOIN Applications ap ON cu.ApplicationId = ap.ApplicationId
JOIN Applications ap ON cu.ApplicationId = ap.ApplicationId
WHERE cu.CustomisationId = @customisationId",
new { customisationId }
);
Expand Down Expand Up @@ -345,5 +346,22 @@ FROM Customisations AS c
new { centreId, categoryId }
);
}

public bool DoesCourseExistAtCentre(int customisationId, int centreId, int? categoryId)
{
return connection.ExecuteScalar<bool>(
@"SELECT CASE WHEN EXISTS (
SELECT *
FROM Customisations AS c
JOIN Applications AS a on a.ApplicationID = c.ApplicationID
WHERE CustomisationID = @customisationId
AND c.CentreID = @centreId
AND (a.CourseCategoryID = @categoryId OR @categoryId IS NULL)
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END",
new { customisationId, centreId, categoryId }
);
}
}
}
27 changes: 10 additions & 17 deletions DigitalLearningSolutions.Data/Services/CourseAdminFieldsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@

public interface ICourseAdminFieldsService
{
public CourseAdminFields GetCustomPromptsForCourse(int customisationId, int centreId, int categoryId);
public CourseAdminFields GetCustomPromptsForCourse(int customisationId, int centreId);

public List<CustomPromptWithAnswer> GetCustomPromptsWithAnswersForCourse(
DelegateCourseInfo delegateCourseInfo,
int customisationId,
int centreId,
int categoryId = 0
int centreId
);

public void UpdateCustomPromptForCourse(int customisationId, int promptId, string? options);
Expand All @@ -27,7 +26,6 @@ public List<CustomPromptWithAnswer> GetCustomPromptsWithAnswersForCourse(
public bool AddCustomPromptToCourse(
int customisationId,
int centreId,
int categoryId,
int promptId,
string? options
);
Expand All @@ -53,11 +51,10 @@ ILogger<CourseAdminFieldsService> logger

public CourseAdminFields GetCustomPromptsForCourse(
int customisationId,
int centreId,
int categoryId = 0
int centreId
)
{
var result = courseAdminFieldsDataService.GetCourseAdminFields(customisationId, centreId, categoryId);
var result = courseAdminFieldsDataService.GetCourseAdminFields(customisationId, centreId);
return new CourseAdminFields(
customisationId,
centreId,
Expand All @@ -68,11 +65,10 @@ public CourseAdminFields GetCustomPromptsForCourse(
public List<CustomPromptWithAnswer> GetCustomPromptsWithAnswersForCourse(
DelegateCourseInfo delegateCourseInfo,
int customisationId,
int centreId,
int categoryId = 0
int centreId
)
{
var result = GetCourseCustomPromptsResultForCourse(customisationId, centreId, categoryId);
var result = GetCourseCustomPromptsResultForCourse(customisationId, centreId);

return PopulateCustomPromptWithAnswerListFromCourseAdminFieldsResult(result, delegateCourseInfo);
}
Expand All @@ -90,15 +86,13 @@ public void UpdateCustomPromptForCourse(int customisationId, int promptId, strin
public bool AddCustomPromptToCourse(
int customisationId,
int centreId,
int categoryId,
int promptId,
string? options
)
{
var courseAdminFields = GetCustomPromptsForCourse(
customisationId,
centreId,
categoryId
centreId
);

var promptNumber = GetNextPromptNumber(courseAdminFields);
Expand Down Expand Up @@ -157,12 +151,11 @@ public string GetPromptName(int customisationId, int promptNumber)

private CourseAdminFieldsResult? GetCourseCustomPromptsResultForCourse(
int customisationId,
int centreId,
int categoryId
int centreId
)
{
var result = courseAdminFieldsDataService.GetCourseAdminFields(customisationId, centreId, categoryId);
if (result == null || categoryId != 0 && result.CourseCategoryId != categoryId)
var result = courseAdminFieldsDataService.GetCourseAdminFields(customisationId, centreId);
if (result == null)
{
return null;
}
Expand Down
Loading