From d05cfb47ed4cab9ae8f2740073103f7af9ad00f0 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Sat, 7 Feb 2026 20:33:38 +0000 Subject: [PATCH] Add collector for Stockport Metropolitan Borough Council - Implements ICollector interface - Adds integration tests with new format - Successfully tested with example postcode from issue - Rebased onto main Closes #98 Co-authored-by: Andrew Riggs --- .../StockportMetropolitanBoroughCouncil.cs | 387 ++++++++++++++++++ ...tockportMetropolitanBoroughCouncilTests.cs | 32 ++ 2 files changed, 419 insertions(+) create mode 100644 BinDays.Api.Collectors/Collectors/Councils/StockportMetropolitanBoroughCouncil.cs create mode 100644 BinDays.Api.IntegrationTests/Collectors/Councils/StockportMetropolitanBoroughCouncilTests.cs diff --git a/BinDays.Api.Collectors/Collectors/Councils/StockportMetropolitanBoroughCouncil.cs b/BinDays.Api.Collectors/Collectors/Councils/StockportMetropolitanBoroughCouncil.cs new file mode 100644 index 0000000..8f0c206 --- /dev/null +++ b/BinDays.Api.Collectors/Collectors/Councils/StockportMetropolitanBoroughCouncil.cs @@ -0,0 +1,387 @@ +namespace BinDays.Api.Collectors.Collectors.Councils; + +using BinDays.Api.Collectors.Collectors.Vendors; +using BinDays.Api.Collectors.Models; +using BinDays.Api.Collectors.Utilities; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; + +/// +/// Collector implementation for Stockport Metropolitan Borough Council. +/// +internal sealed partial class StockportMetropolitanBoroughCouncil : GovUkCollectorBase, ICollector +{ + /// + public string Name => "Stockport Metropolitan Borough Council"; + + /// + public Uri WebsiteUrl => new("https://www.stockport.gov.uk/"); + + /// + public override string GovUkId => "stockport"; + + /// + /// The list of bin types for this collector. + /// + private readonly IReadOnlyCollection _binTypes = + [ + new() + { + Name = "General Waste", + Colour = BinColour.Black, + Keys = [ "Black" ], + }, + new() + { + Name = "Garden and Food Waste", + Colour = BinColour.Green, + Keys = [ "Green" ], + }, + new() + { + Name = "Waste Paper Recycling", + Colour = BinColour.Blue, + Keys = [ "Blue" ], + }, + new() + { + Name = "Glass, Aluminium and Plastic Recycling", + Colour = BinColour.Brown, + Keys = [ "Brown" ], + }, + ]; + + /// + /// Regex for extracting the request verification token. + /// + [GeneratedRegex(@"__RequestVerificationToken"" type=""hidden"" value=""(?[^""]+)""")] + private static partial Regex TokenRegex(); + + /// + /// Regex for parsing addresses from the select options. + /// + [GeneratedRegex(@"