added new file change checker

This commit is contained in:
2024-05-06 16:53:39 -06:00
parent 5c931af141
commit 3aaf64d3a0
5 changed files with 878 additions and 211 deletions

View File

@@ -0,0 +1,515 @@
using LocalModels;
public class CouresDifferencesChangesTests
{
[Fact]
public void CanDetectNewSettings()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = []
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "new course name" },
Modules = []
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().BeEmpty();
differences.Settings.Should().NotBeNull();
differences.Settings?.Name.Should().Be("new course name");
}
[Fact]
public void CanDetectNewModule()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = []
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().NotBeNull();
differences.Modules?.Count().Should().Be(1);
differences.Modules?.First().Name.Should().Be("new module");
}
[Fact]
public void CanDetectChangedAssignment()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = new DateTime(),
SubmissionTypes = [],
Rubric = []
}
]
}]
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "new description",
DueAt = new DateTime(),
SubmissionTypes = [],
Rubric = []
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().NotBeNull();
differences.Modules?.Count().Should().Be(1);
differences.Modules?.First().Assignments.First().Description.Should().Be("new description");
}
[Fact]
public void CanProperlyIgnoreUnchangedModules()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}]
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().BeEmpty();
}
[Fact]
public void OnlyChangedAssignmentRepresented()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [AssignmentSubmissionType.ONLINE_UPLOAD],
Rubric = [ new() {Points = 1, Label = "rubric"} ],
},
new()
{
Name = "test assignment 2",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = [],
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [AssignmentSubmissionType.ONLINE_UPLOAD],
Rubric = [ new() {Points = 1, Label = "rubric"} ],
},
new()
{
Name = "test assignment 2 with a new name",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.First().Assignments.Count().Should().Be(1);
differences.Modules.First().Assignments.First().Name.Should().Be("test assignment 2 with a new name");
}
[Fact]
public void IdenticalQuizzesIgnored()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(0);
}
[Fact]
public void CanDetectDifferentQuiz()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = DateTime.MaxValue,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(1);
differences.Modules.First().Quizzes.Count().Should().Be(1);
differences.Modules.First().Quizzes.First().LockAt.Should().Be(DateTime.MaxValue);
}
[Fact]
public void CanDetectOnlyDifferentQuiz_WhenOtherQuizzesStay()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [new(){
Name = "new module",
Assignments = [],
Quizzes = [
new()
{
Name = "Test Quiz",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
},
new()
{
Name = "Test Quiz 2",
Description = @"this is my description ",
LockAt = commonDate,
DueAt = commonDate,
ShuffleAnswers = true,
OneQuestionAtATime = false,
LocalAssignmentGroupName = "someId",
AllowedAttempts = -1,
Questions = []
}
]
}]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(1);
differences.Modules.First().Quizzes.Count().Should().Be(1);
differences.Modules.First().Quizzes.First().Name.Should().Be("Test Quiz 2");
}
[Fact]
public void SamePagesNotDetected()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description",
DueAt = commonDate
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description",
DueAt = commonDate
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(0);
}
[Fact]
public void DifferentPageDetected()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description",
DueAt = commonDate
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description changed",
DueAt = commonDate
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(1);
differences.Modules.First().Pages.Count().Should().Be(1);
differences.Modules.First().Pages.First().Text.Should().Be("test description changed");
}
[Fact]
public void DifferentPageDetected_ButNotSamePage()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description",
DueAt = commonDate
}
]
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new(){
Name = "new module",
Pages = [
new()
{
Name= "test page",
Text = "test description",
DueAt = commonDate
},
new()
{
Name= "test page 2",
Text = "test description",
DueAt = commonDate
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Count().Should().Be(1);
differences.Modules.First().Pages.Count().Should().Be(1);
differences.Modules.First().Pages.First().Name.Should().Be("test page 2");
}
}

View File

@@ -1,208 +0,0 @@
using LocalModels;
public class CoursesDifferencesTests
{
[Fact]
public void CanDetectNewSettings()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = []
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "new course name" },
Modules = []
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().BeEmpty();
differences.Settings.Should().NotBeNull();
differences.Settings?.Name.Should().Be("new course name");
}
[Fact]
public void CanDetectNewModule()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = []
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().NotBeNull();
differences.Modules?.Count().Should().Be(1);
differences.Modules?.First().Name.Should().Be("new module");
}
[Fact]
public void CanDetectChangedAssignment()
{
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = new DateTime(),
SubmissionTypes = [],
Rubric = []
}
]
}]
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "new description",
DueAt = new DateTime(),
SubmissionTypes = [],
Rubric = []
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().NotBeNull();
differences.Modules?.Count().Should().Be(1);
differences.Modules?.First().Assignments.First().Description.Should().Be("new description");
}
[Fact]
public void CanProperlyIgnoreUnchangedModules()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}]
};
LocalCourse newCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.Should().BeEmpty();
}
[Fact]
public void OnlyChangedAssignmentRepresented()
{
var commonDate = new DateTime();
LocalCourse oldCourse = new()
{
Settings = new() { Name = "Test Course" },
Modules = [new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [AssignmentSubmissionType.ONLINE_UPLOAD],
Rubric = [ new() {Points = 1, Label = "rubric"} ],
},
new()
{
Name = "test assignment 2",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = [],
}
]
}]
};
LocalCourse newCourse = oldCourse with {
Modules = [
new()
{
Name = "new module",
Assignments = [
new()
{
Name = "test assignment",
Description = "",
DueAt = commonDate,
SubmissionTypes = [AssignmentSubmissionType.ONLINE_UPLOAD],
Rubric = [ new() {Points = 1, Label = "rubric"} ],
},
new()
{
Name = "test assignment 2 with a new name",
Description = "",
DueAt = commonDate,
SubmissionTypes = [],
Rubric = []
}
]
}
]
};
var differences = CourseDifferences.GetNewChanges(newCourse, oldCourse);
differences.Modules.First().Assignments.Count().Should().Be(1);
differences.Modules.First().Assignments.First().Name.Should().Be("test assignment 2 with a new name");
}
}

View File

@@ -0,0 +1,297 @@
using LocalModels;
public class CourseDifferencesDeletionsTests
{
[Fact]
public void SameModuleDoesNotGetDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module"
}]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module"
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.NamesOfModulesToDeleteCompletely.Should().BeEmpty();
}
[Fact]
public void ChangedModule_OldOneGetsDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module"
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module 2"
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.NamesOfModulesToDeleteCompletely.Count().Should().Be(1);
differences.NamesOfModulesToDeleteCompletely.First().Should().Be("test module");
}
[Fact]
public void newAssignmentNameGetsDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment"
}
]
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment changed name"
}
]
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.NamesOfModulesToDeleteCompletely.Should().BeEmpty();
differences.DeleteContentsOfModule.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Assignments.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Assignments.First().Name.Should().Be("test assignment");
}
[Fact]
public void AssignmentsWithChangedDescriptionsDoNotGetDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment",
Description = "test description",
}
]
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment",
Description = "test description",
}
]
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.DeleteContentsOfModule.Should().BeEmpty();
}
[Fact]
public void CanDetectChangedAndUnchangedAssignments()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment",
Description = "test description",
},
new()
{
Name = "test assignment 2",
Description = "test description",
}
]
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module",
Assignments = [
new()
{
Name = "test assignment",
Description = "test description",
},
new()
{
Name = "test assignment 2 changed",
Description = "test description",
}
]
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.DeleteContentsOfModule.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Assignments.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Assignments.First().Name.Should().Be("test assignment 2");
}
[Fact]
public void ChangedQuizzesGetDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module",
Quizzes = [
new()
{
Name = "Test Quiz",
Description = "test description"
},
new()
{
Name = "Test Quiz 2",
Description = "test description"
}
]
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module",
Quizzes = [
new()
{
Name = "Test Quiz",
Description = "test description"
},
new()
{
Name = "Test Quiz 3",
Description = "test description"
}
]
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.DeleteContentsOfModule.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Quizzes.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Quizzes.First().Name.Should().Be("Test Quiz 2");
}
[Fact]
public void ChangedPagesGetDeleted()
{
LocalCourse oldCourse = new()
{
Settings = new() { },
Modules = [
new()
{
Name = "test module",
Pages = [
new()
{
Name = "Test Page",
Text = "test contents"
},
new()
{
Name = "Test Page 2",
Text = "test contents"
},
]
}
]
};
LocalCourse newCourse = oldCourse with
{
Modules = [
new()
{
Name = "test module",
Pages = [
new()
{
Name = "Test Page",
Text = "test contents"
},
new()
{
Name = "Test Page 3",
Text = "test contents"
},
]
}]
};
var differences = CourseDifferences.GetDeletedChanges(newCourse, oldCourse);
differences.DeleteContentsOfModule.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Pages.Count().Should().Be(1);
differences.DeleteContentsOfModule.First().Pages.First().Name.Should().Be("Test Page 2");
}
}

View File

@@ -2,6 +2,53 @@ using LocalModels;
public static class CourseDifferences
{
public static DeleteCourseChanges GetDeletedChanges(LocalCourse newCourse, LocalCourse oldCourse)
{
if (newCourse == oldCourse)
return new DeleteCourseChanges();
var moduleNamesNoLongerReferenced = oldCourse.Modules
.Where(oldModule =>
!newCourse.Modules.Any(newModule => newModule.Name == oldModule.Name)
)
.Select(oldModule => oldModule.Name)
.ToList();
var modulesWithDeletions = oldCourse.Modules
.Where(oldModule =>
!newCourse.Modules.Any(newModule => newModule.Equals(oldModule))
)
.Select(oldModule =>
{
var newModule = newCourse.Modules.FirstOrDefault(m => m.Name == oldModule.Name);
if (newModule == null)
return oldModule;
var unreferencedAssignments = oldModule.Assignments.Where(oldAssignment =>
!newModule.Assignments.Any(newAssignment => newAssignment.Name == oldAssignment.Name)
);
var unreferencedQuizzes = oldModule.Quizzes.Where(oldQuiz =>
!newModule.Quizzes.Any(newQuiz => newQuiz.Name == oldQuiz.Name)
);
var unreferencedPages = oldModule.Pages.Where(oldPage =>
!newModule.Pages.Any(newPage => newPage.Name == oldPage.Name)
);
return oldModule with
{
Assignments = unreferencedAssignments,
Quizzes = unreferencedQuizzes,
Pages = unreferencedPages,
};
})
.ToList();
return new DeleteCourseChanges
{
NamesOfModulesToDeleteCompletely = moduleNamesNoLongerReferenced,
DeleteContentsOfModule = modulesWithDeletions,
};
}
public static NewCourseChanges GetNewChanges(LocalCourse newCourse, LocalCourse oldCourse)
{
if (newCourse == oldCourse)
@@ -20,7 +67,18 @@ public static class CourseDifferences
var newAssignments = newModule.Assignments.Where(
newAssignment => !oldModule.Assignments.Any(oldAssignment => newAssignment == oldAssignment)
);
return newModule with { Assignments = newAssignments };
var newQuizzes = newModule.Quizzes.Where(
newQuiz => !oldModule.Quizzes.Any(oldQuiz => newQuiz == oldQuiz)
);
var newPages = newModule.Pages.Where(
newPage => !oldModule.Pages.Any(oldPage => newPage == oldPage)
);
return newModule with
{
Assignments = newAssignments,
Quizzes = newQuizzes,
Pages = newPages,
};
})
.ToArray();
@@ -37,4 +95,9 @@ public record NewCourseChanges
{
public IEnumerable<LocalModule> Modules { get; init; } = [];
public LocalCourseSettings? Settings { get; init; }
}
public record DeleteCourseChanges
{
public IEnumerable<string> NamesOfModulesToDeleteCompletely { get; init; } = [];
public IEnumerable<LocalModule> DeleteContentsOfModule { get; init; } = [];
}

View File

@@ -26,7 +26,7 @@ Authorization: Bearer {{$dotenv CANVAS_TOKEN}}
}
###
POST https://snow.instructure.com/api/v1/courses/705168/assignments
POST https://snow.instructure.com/api/v1/courses/959700/assignments
Authorization: Bearer {{$dotenv CANVAS_TOKEN}}
{
@@ -139,4 +139,4 @@ GET https://snow.instructure.com/api/v1/courses/871954/assignment_groups/1943132
Authorization: Bearer {{$dotenv CANVAS_TOKEN}}
###
GET https://snow.instructure.com/api/v1/courses/871954
Authorization: Bearer {{$dotenv CANVAS_TOKEN}}
Authorization: Bearer {{$dotenv CANVAS_TOKEN}}