Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
ada0e55
Merge pull request #147 from Resgrid/develop
ucswift Aug 18, 2024
7172602
Merge pull request #148 from Resgrid/develop
ucswift Aug 22, 2024
1ead6ab
Merge pull request #149 from Resgrid/develop
ucswift Aug 29, 2024
6aae0cd
Merge pull request #150 from Resgrid/develop
ucswift Aug 29, 2024
923c2b6
Merge pull request #152 from Resgrid/develop
ucswift Sep 7, 2024
c2a3e6d
Merge pull request #153 from Resgrid/develop
ucswift Oct 2, 2024
9c35c06
Merge pull request #154 from Resgrid/develop
ucswift Oct 5, 2024
4c21f2c
Merge pull request #155 from Resgrid/develop
ucswift Oct 8, 2024
91e01fb
Merge pull request #156 from Resgrid/develop
ucswift Oct 9, 2024
22a7312
Merge pull request #157 from Resgrid/develop
ucswift Oct 10, 2024
85bf4d3
Merge pull request #158 from Resgrid/develop
ucswift Oct 11, 2024
de7ac44
Merge pull request #159 from Resgrid/develop
ucswift Oct 12, 2024
b1c15a4
Merge pull request #160 from Resgrid/develop
ucswift Oct 12, 2024
4eae821
Merge pull request #161 from Resgrid/develop
ucswift Oct 12, 2024
d84dcfc
Merge pull request #165 from Resgrid/develop
ucswift Dec 12, 2024
52798f9
Merge pull request #166 from Resgrid/develop
ucswift Dec 31, 2024
903359d
Merge pull request #167 from Resgrid/develop
ucswift Jan 11, 2025
abdc4b3
Merge pull request #170 from Resgrid/develop
ucswift Mar 10, 2025
a0ec5c0
Merge pull request #171 from Resgrid/develop
ucswift Mar 11, 2025
1c66305
Merge pull request #172 from Resgrid/develop
ucswift Mar 11, 2025
2e31931
Merge pull request #173 from Resgrid/develop
ucswift Mar 12, 2025
e28e442
Merge pull request #174 from Resgrid/develop
ucswift Mar 25, 2025
9898d66
Merge pull request #175 from Resgrid/develop
ucswift Mar 25, 2025
a39494c
Merge pull request #176 from Resgrid/develop
ucswift Mar 26, 2025
bcc3954
Merge pull request #177 from Resgrid/develop
ucswift Mar 27, 2025
9f18287
Merge pull request #178 from Resgrid/develop
ucswift Mar 27, 2025
90b172c
Merge pull request #179 from Resgrid/develop
ucswift Mar 27, 2025
98f6ff4
Merge pull request #182 from Resgrid/develop
ucswift Mar 28, 2025
49fbda7
Merge pull request #187 from Resgrid/develop
ucswift Mar 30, 2025
70165a2
Merge pull request #191 from Resgrid/develop
ucswift Apr 4, 2025
9c71e22
Merge pull request #193 from Resgrid/develop
ucswift Apr 5, 2025
6f7f95e
Merge pull request #194 from Resgrid/develop
ucswift Apr 7, 2025
e99378b
Merge pull request #195 from Resgrid/develop
ucswift Apr 8, 2025
83647ad
Merge pull request #196 from Resgrid/develop
ucswift Apr 8, 2025
014b488
Merge pull request #197 from Resgrid/develop
ucswift Apr 14, 2025
1f3cc3c
Merge pull request #198 from Resgrid/develop
ucswift Apr 14, 2025
b232bdc
Merge pull request #199 from Resgrid/develop
ucswift Apr 14, 2025
73c44d2
Merge pull request #200 from Resgrid/develop
ucswift Apr 15, 2025
bb07d58
Merge pull request #201 from Resgrid/develop
ucswift Apr 15, 2025
33e394d
Merge pull request #202 from Resgrid/develop
ucswift Apr 15, 2025
0abb4a2
Merge pull request #203 from Resgrid/develop
ucswift Apr 15, 2025
c96c5ea
Merge pull request #204 from Resgrid/develop
ucswift Apr 15, 2025
7d8b6e9
Merge pull request #205 from Resgrid/develop
ucswift Apr 16, 2025
26a2b3a
Merge pull request #206 from Resgrid/develop
ucswift Apr 16, 2025
cd4eaa8
Merge pull request #207 from Resgrid/develop
ucswift Apr 17, 2025
6b7da55
Merge pull request #209 from Resgrid/develop
ucswift Apr 17, 2025
257211f
Merge pull request #210 from Resgrid/develop
ucswift Apr 18, 2025
183a279
Merge pull request #212 from Resgrid/develop
ucswift Apr 22, 2025
97b6e26
Merge pull request #213 from Resgrid/develop
ucswift Apr 23, 2025
0f3015e
Merge pull request #214 from Resgrid/develop
ucswift Apr 27, 2025
69a8373
Merge pull request #215 from Resgrid/develop
ucswift Apr 29, 2025
7b2a220
Merge pull request #217 from Resgrid/develop
ucswift May 4, 2025
ead0799
Merge pull request #218 from Resgrid/develop
ucswift May 14, 2025
b28a253
Merge pull request #219 from Resgrid/develop
ucswift May 14, 2025
d69a976
Merge pull request #220 from Resgrid/develop
ucswift May 14, 2025
48552ac
Merge pull request #221 from Resgrid/develop
ucswift May 14, 2025
ee808d3
Merge pull request #227 from Resgrid/develop
ucswift Jul 10, 2025
0e5ad48
Merge pull request #230 from Resgrid/develop
ucswift Jul 16, 2025
2d4a780
Merge pull request #232 from Resgrid/develop
ucswift Jul 18, 2025
3fac2b4
Merge pull request #234 from Resgrid/develop
ucswift Aug 12, 2025
3edc042
Merge pull request #235 from Resgrid/develop
ucswift Aug 14, 2025
3a4fde6
Merge pull request #236 from Resgrid/develop
ucswift Aug 15, 2025
963535b
Merge pull request #237 from Resgrid/develop
ucswift Aug 17, 2025
0ea711e
Merge pull request #240 from Resgrid/develop
ucswift Aug 27, 2025
8b3f079
Merge pull request #241 from Resgrid/develop
ucswift Aug 28, 2025
d0d01c0
Merge pull request #244 from Resgrid/develop
ucswift Sep 10, 2025
89727e5
Merge pull request #245 from Resgrid/develop
ucswift Sep 11, 2025
4e54b00
Merge pull request #247 from Resgrid/develop
ucswift Sep 22, 2025
298b09b
Merge pull request #249 from Resgrid/develop
ucswift Sep 28, 2025
713677c
Merge pull request #255 from Resgrid/develop
ucswift Oct 3, 2025
0f606fe
Merge pull request #259 from Resgrid/develop
ucswift Oct 23, 2025
52df831
Merge pull request #262 from Resgrid/develop
ucswift Nov 8, 2025
84356ce
Merge pull request #263 from Resgrid/develop
ucswift Nov 8, 2025
9b5e9eb
Merge pull request #264 from Resgrid/develop
ucswift Nov 9, 2025
e4a8de4
Merge pull request #265 from Resgrid/develop
ucswift Nov 9, 2025
3eacf2a
Merge pull request #276 from Resgrid/develop
ucswift Feb 12, 2026
cc736be
Merge pull request #277 from Resgrid/develop
ucswift Feb 12, 2026
e909879
Merge pull request #278 from Resgrid/develop
ucswift Feb 13, 2026
069179f
Merge pull request #279 from Resgrid/develop
ucswift Feb 13, 2026
1da63ab
Merge pull request #280 from Resgrid/develop
ucswift Feb 14, 2026
f509d38
Merge pull request #281 from Resgrid/develop
ucswift Feb 18, 2026
9a67d37
Merge pull request #283 from Resgrid/develop
ucswift Feb 27, 2026
f7ffd8b
Merge pull request #284 from Resgrid/develop
ucswift Mar 3, 2026
6d30895
Merge pull request #285 from Resgrid/develop
ucswift Mar 3, 2026
3a5b033
Merge pull request #287 from Resgrid/develop
ucswift Mar 4, 2026
93ba417
Merge pull request #292 from Resgrid/develop
ucswift Mar 9, 2026
cce3c4f
Merge pull request #294 from Resgrid/develop
ucswift Mar 10, 2026
3e41cf5
Merge pull request #295 from Resgrid/develop
ucswift Mar 11, 2026
115a62c
Merge pull request #296 from Resgrid/develop
ucswift Mar 11, 2026
b9c1c75
Merge pull request #297 from Resgrid/develop
ucswift Mar 12, 2026
2dcedec
Merge pull request #298 from Resgrid/develop
ucswift Mar 13, 2026
f4ef7f2
Merge pull request #299 from Resgrid/develop
ucswift Mar 13, 2026
9151444
Merge pull request #300 from Resgrid/develop
ucswift Mar 15, 2026
1e4c5be
Merge pull request #301 from Resgrid/develop
ucswift Mar 17, 2026
1a0db64
Merge pull request #302 from Resgrid/develop
ucswift Mar 18, 2026
c306095
Merge pull request #303 from Resgrid/develop
ucswift Mar 18, 2026
6f96fa7
Merge pull request #304 from Resgrid/develop
ucswift Mar 19, 2026
9b70aa3
Merge pull request #305 from Resgrid/develop
ucswift Mar 20, 2026
1606ee0
Merge pull request #307 from Resgrid/develop
ucswift Mar 26, 2026
dbbce63
Merge pull request #312 from Resgrid/develop
ucswift Mar 29, 2026
6beef8b
Fix: Replace empty divs with proper Bootstrap modals for Respond to C…
waylonkenning Apr 5, 2026
79bf71d
feat(training): Add edit functionality for training module
waylonkenning Apr 5, 2026
0f57208
Update Web/Resgrid.Web/Areas/User/Controllers/TrainingsController.cs
ucswift Apr 9, 2026
9816662
Update Web/Resgrid.Web/Areas/User/Controllers/TrainingsController.cs
ucswift Apr 9, 2026
8280959
Update Web/Resgrid.Web/Areas/User/Models/Training/EditTrainingModel.cs
ucswift Apr 9, 2026
7f5ab14
Update Web/Resgrid.Web/Areas/User/Views/Home/Dashboard.cshtml
ucswift Apr 9, 2026
a5d4a8a
Apply suggestion from @coderabbitai[bot]
ucswift Apr 9, 2026
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
103 changes: 103 additions & 0 deletions Tests/Resgrid.Tests/Mocks/MockTrainingAttachmentRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Resgrid.Model;
using Resgrid.Model.Repositories;

namespace Resgrid.Tests.Mocks
{
/// <summary>
/// In-memory mock for <see cref="ITrainingAttachmentRepository"/>
/// </summary>
public sealed class MockTrainingAttachmentRepository : ITrainingAttachmentRepository
{
private readonly List<TrainingAttachment> _attachments = new List<TrainingAttachment>();
private int _nextId = 1;

public Task<IEnumerable<TrainingAttachment>> GetAllAsync()
=> Task.FromResult<IEnumerable<TrainingAttachment>>(_attachments.ToList());

public Task<TrainingAttachment> GetByIdAsync(object id)
{
var intId = (int)id;
var attachment = _attachments.FirstOrDefault(a => a.TrainingAttachmentId == intId);
return Task.FromResult(attachment);
}

public Task<IEnumerable<TrainingAttachment>> GetAllByDepartmentIdAsync(int departmentId)
=> Task.FromResult<IEnumerable<TrainingAttachment>>(new List<TrainingAttachment>());

public Task<IEnumerable<TrainingAttachment>> GetAllByUserIdAsync(string userId)
=> Task.FromResult<IEnumerable<TrainingAttachment>>(new List<TrainingAttachment>());

public Task<TrainingAttachment> InsertAsync(TrainingAttachment entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
entity.TrainingAttachmentId = _nextId++;
_attachments.Add(entity);
return Task.FromResult(entity);
}

public Task<TrainingAttachment> UpdateAsync(TrainingAttachment entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
var existing = _attachments.FirstOrDefault(a => a.TrainingAttachmentId == entity.TrainingAttachmentId);
if (existing != null)
{
_attachments.Remove(existing);
}
_attachments.Add(entity);
return Task.FromResult(entity);
}

public Task<bool> DeleteAsync(TrainingAttachment entity, CancellationToken cancellationToken)
{
var existing = _attachments.FirstOrDefault(a => a.TrainingAttachmentId == entity.TrainingAttachmentId);
if (existing != null)
{
_attachments.Remove(existing);
}
return Task.FromResult(true);
}

public Task<TrainingAttachment> SaveOrUpdateAsync(TrainingAttachment entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
if (entity.TrainingAttachmentId == 0)
{
entity.TrainingAttachmentId = _nextId++;
_attachments.Add(entity);
}
else
{
var existing = _attachments.FirstOrDefault(a => a.TrainingAttachmentId == entity.TrainingAttachmentId);
if (existing != null)
{
_attachments.Remove(existing);
}
_attachments.Add(entity);
}
return Task.FromResult(entity);
}

public Task<bool> DeleteMultipleAsync(TrainingAttachment entity, string parentKeyName, object parentKeyId, List<object> ids, CancellationToken cancellationToken)
=> Task.FromResult(true);

public Task<IEnumerable<TrainingAttachment>> GetTrainingAttachmentsByTrainingIdAsync(int trainingId)
{
var result = _attachments.Where(a => a.TrainingId == trainingId).ToList();
return Task.FromResult<IEnumerable<TrainingAttachment>>(result);
}

public void SeedAttachment(TrainingAttachment attachment)
{
if (attachment.TrainingAttachmentId == 0)
{
attachment.TrainingAttachmentId = _nextId++;
}
else
{
_nextId = System.Math.Max(_nextId, attachment.TrainingAttachmentId + 1);
}
_attachments.Add(attachment);
}
}
}
103 changes: 103 additions & 0 deletions Tests/Resgrid.Tests/Mocks/MockTrainingQuestionRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Resgrid.Model;
using Resgrid.Model.Repositories;

namespace Resgrid.Tests.Mocks
{
/// <summary>
/// In-memory mock for <see cref="ITrainingQuestionRepository"/>
/// </summary>
public sealed class MockTrainingQuestionRepository : ITrainingQuestionRepository
{
private readonly List<TrainingQuestion> _questions = new List<TrainingQuestion>();
private int _nextId = 1;

public Task<IEnumerable<TrainingQuestion>> GetAllAsync()
=> Task.FromResult<IEnumerable<TrainingQuestion>>(_questions.ToList());

public Task<TrainingQuestion> GetByIdAsync(object id)
{
var intId = (int)id;
var question = _questions.FirstOrDefault(q => q.TrainingQuestionId == intId);
return Task.FromResult(question);
}

public Task<IEnumerable<TrainingQuestion>> GetAllByDepartmentIdAsync(int departmentId)
=> Task.FromResult<IEnumerable<TrainingQuestion>>(new List<TrainingQuestion>());

public Task<IEnumerable<TrainingQuestion>> GetAllByUserIdAsync(string userId)
=> Task.FromResult<IEnumerable<TrainingQuestion>>(new List<TrainingQuestion>());

public Task<TrainingQuestion> InsertAsync(TrainingQuestion entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
entity.TrainingQuestionId = _nextId++;
_questions.Add(entity);
return Task.FromResult(entity);
}

public Task<TrainingQuestion> UpdateAsync(TrainingQuestion entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
var existing = _questions.FirstOrDefault(q => q.TrainingQuestionId == entity.TrainingQuestionId);
if (existing != null)
{
_questions.Remove(existing);
}
_questions.Add(entity);
return Task.FromResult(entity);
}

public Task<bool> DeleteAsync(TrainingQuestion entity, CancellationToken cancellationToken)
{
var existing = _questions.FirstOrDefault(q => q.TrainingQuestionId == entity.TrainingQuestionId);
if (existing != null)
{
_questions.Remove(existing);
}
return Task.FromResult(true);
}

public Task<TrainingQuestion> SaveOrUpdateAsync(TrainingQuestion entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
if (entity.TrainingQuestionId == 0)
{
entity.TrainingQuestionId = _nextId++;
_questions.Add(entity);
}
else
{
var existing = _questions.FirstOrDefault(q => q.TrainingQuestionId == entity.TrainingQuestionId);
if (existing != null)
{
_questions.Remove(existing);
}
_questions.Add(entity);
}
return Task.FromResult(entity);
}

public Task<bool> DeleteMultipleAsync(TrainingQuestion entity, string parentKeyName, object parentKeyId, List<object> ids, CancellationToken cancellationToken)
=> Task.FromResult(true);
Comment on lines +81 to +82
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

DeleteMultipleAsync is a no-op and can mask edit-flow bugs in tests.

This currently returns success without deleting anything from _questions, so tests can pass even when deletion logic regresses.

Proposed fix
 public Task<bool> DeleteMultipleAsync(TrainingQuestion entity, string parentKeyName, object parentKeyId, List<object> ids, CancellationToken cancellationToken)
-	=> Task.FromResult(true);
+{
+	if (ids == null || ids.Count == 0)
+		return Task.FromResult(true);
+
+	var idSet = new HashSet<int>(ids.Select(System.Convert.ToInt32));
+	_questions.RemoveAll(q => idSet.Contains(q.TrainingQuestionId));
+	return Task.FromResult(true);
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Tests/Resgrid.Tests/Mocks/MockTrainingQuestionRepository.cs` around lines 81
- 82, The DeleteMultipleAsync implementation currently short-circuits and
returns true without mutating the in-memory store, which can hide regressions;
update the MockTrainingQuestionRepository.DeleteMultipleAsync method to actually
remove entries from the _questions collection that belong to the specified
parent (matching parentKeyName/parentKeyId) and whose IDs are in the provided
ids list, respect the CancellationToken, and return true if all requested IDs
were removed (or false if any were not found) so tests accurately reflect
deletion behavior.


public Task<IEnumerable<TrainingQuestion>> GetTrainingQuestionsByTrainingIdAsync(int trainingId)
{
var result = _questions.Where(q => q.TrainingId == trainingId).ToList();
return Task.FromResult<IEnumerable<TrainingQuestion>>(result);
}

public void SeedQuestion(TrainingQuestion question)
{
if (question.TrainingQuestionId == 0)
{
question.TrainingQuestionId = _nextId++;
}
else
{
_nextId = System.Math.Max(_nextId, question.TrainingQuestionId + 1);
}
_questions.Add(question);
}
Comment on lines +90 to +101
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

SeedQuestion can introduce duplicate IDs and stale reads.

Seeding the same TrainingQuestionId more than once appends duplicates; GetByIdAsync then returns the first match, which may be stale.

Proposed fix
 public void SeedQuestion(TrainingQuestion question)
 {
+	var existing = _questions.FirstOrDefault(q => q.TrainingQuestionId == question.TrainingQuestionId);
+	if (existing != null)
+	{
+		_questions.Remove(existing);
+	}
+
 	if (question.TrainingQuestionId == 0)
 	{
 		question.TrainingQuestionId = _nextId++;
 	}
 	else
 	{
 		_nextId = System.Math.Max(_nextId, question.TrainingQuestionId + 1);
 	}
 	_questions.Add(question);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Tests/Resgrid.Tests/Mocks/MockTrainingQuestionRepository.cs` around lines 90
- 101, SeedQuestion currently appends a TrainingQuestion regardless of duplicate
TrainingQuestionId which can produce duplicate entries and stale reads from
GetByIdAsync; update SeedQuestion in MockTrainingQuestionRepository to check
_questions for an existing question with the same TrainingQuestionId and
replace/update that entry instead of adding a new one, and still adjust _nextId
using Math.Max(_nextId, question.TrainingQuestionId + 1) when an explicit id is
provided; ensure GetByIdAsync continues to query the single authoritative entry
(or the replaced entry) so consumers get the latest seeded object.

}
}
121 changes: 121 additions & 0 deletions Tests/Resgrid.Tests/Mocks/MockTrainingRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Resgrid.Model;
using Resgrid.Model.Repositories;

namespace Resgrid.Tests.Mocks
{
/// <summary>
/// In-memory mock for <see cref="ITrainingRepository"/> that stores trainings
/// without requiring a database connection.
/// </summary>
public sealed class MockTrainingRepository : ITrainingRepository
{
private readonly List<Training> _trainings = new List<Training>();
private int _nextId = 1;

public List<Training> Trainings => _trainings;

public Task<IEnumerable<Training>> GetAllAsync()
=> Task.FromResult<IEnumerable<Training>>(_trainings.ToList());

public Task<Training> GetByIdAsync(object id)
{
var intId = (int)id;
var training = _trainings.FirstOrDefault(t => t.TrainingId == intId);
return Task.FromResult(training);
}

public Task<IEnumerable<Training>> GetAllByDepartmentIdAsync(int departmentId)
{
var result = _trainings.Where(t => t.DepartmentId == departmentId).ToList();
return Task.FromResult<IEnumerable<Training>>(result);
}

public Task<IEnumerable<Training>> GetAllByUserIdAsync(string userId)
=> Task.FromResult<IEnumerable<Training>>(new List<Training>());

public Task<Training> InsertAsync(Training entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
entity.TrainingId = _nextId++;
_trainings.Add(entity);
return Task.FromResult(entity);
}

public Task<Training> UpdateAsync(Training entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
var existing = _trainings.FirstOrDefault(t => t.TrainingId == entity.TrainingId);
if (existing != null)
{
_trainings.Remove(existing);
}
_trainings.Add(entity);
return Task.FromResult(entity);
}

public Task<bool> DeleteAsync(Training entity, CancellationToken cancellationToken)
{
var existing = _trainings.FirstOrDefault(t => t.TrainingId == entity.TrainingId);
if (existing != null)
{
_trainings.Remove(existing);
}
return Task.FromResult(true);
}

public Task<Training> SaveOrUpdateAsync(Training entity, CancellationToken cancellationToken, bool firstLevelOnly = false)
{
if (entity.TrainingId == 0)
{
entity.TrainingId = _nextId++;
_trainings.Add(entity);
}
else
{
var existing = _trainings.FirstOrDefault(t => t.TrainingId == entity.TrainingId);
if (existing != null)
{
_trainings.Remove(existing);
}
_trainings.Add(entity);
}
return Task.FromResult(entity);
}

public Task<bool> DeleteMultipleAsync(Training entity, string parentKeyName, object parentKeyId, List<object> ids, CancellationToken cancellationToken)
=> Task.FromResult(true);

public List<Training> GetAllTrainings()
=> _trainings.ToList();

public Task<IEnumerable<Training>> GetTrainingsByDepartmentIdAsync(int departmentId)
{
var result = _trainings.Where(t => t.DepartmentId == departmentId).ToList();
return Task.FromResult<IEnumerable<Training>>(result);
}

public Task<Training> GetTrainingByTrainingIdAsync(int trainingId)
{
var training = _trainings.FirstOrDefault(t => t.TrainingId == trainingId);
return Task.FromResult(training);
}

/// <summary>
/// Helper method to seed test data
/// </summary>
public void SeedTraining(Training training)
{
if (training.TrainingId == 0)
{
training.TrainingId = _nextId++;
}
else
{
_nextId = System.Math.Max(_nextId, training.TrainingId + 1);
}
_trainings.Add(training);
}
}
}
Loading
Loading