The lab

TechMove

A logistics management system with automated tests, a CI pipeline and a fallback when its currency API goes down.

ASP.NET Core, Entity Framework Core, xUnit, GitHub Actions

Tech stack

  • C#
  • .NET 9
  • ASP.NET Core MVC
  • Entity Framework Core
  • SQL Server
  • xUnit
  • Moq
  • GitHub Actions
  • Frankfurter API

My part

Started as a coursework assignment, then expanded on my own as a sandbox for practising DevOps and platform engineering.

What it does

  • Manages logistics clients, freight contracts and service tasks
  • Delivery prices that scale with the contract, such as 50% extra for express and double for hazardous materials
  • Live USD to ZAR conversion from the Frankfurter API
  • PDF document uploads, with files renamed to random IDs and deleted from disk when their record is removed
  • Search and filters for contracts by status and date, service tasks and clients, kept in the address so a search can be bookmarked
  • Live notifications when a contract's status changes, for example to Expired or On Hold

How it works

  • A GitHub Actions pipeline restores, builds and runs the full xUnit suite on every push and pull request to main.
  • On start-up it looks for a local SQL Server (Developer, Express or LocalDB), sets the connection, creates the database with migrations and seeds it, so a fresh clone runs with no setup.
  • If the currency API is down, it falls back to cached or default rates instead of failing.
  • Split into separate projects, with a data access layer kept apart from the controllers.
  • Uses three Gang of Four patterns: a Strategy for the currency provider so it can be swapped, an Observer that reacts to contract status changes, and a Factory Method that creates contracts with their end dates, reference codes and starting status.
  • Tests run against an in-memory database, and cover disguised file types such as .exe or .bat, currency API timeouts, and restricted contract states.