# Stand-ins for the Veeam Backup for Microsoft 365 cmdlets. Object shapes are best guesses until # checked against Get-Vb365CollectorDiagnostics.ps1 output from a real server. # # . ./tests/MockVb365.ps1 # ./Send-Vb365BackupStatus.ps1 -ConfigPath ./my-test-config.json -DryRun # Fixed to the top of the hour, and IDs derived from names/times, so repeated runs see the same data $now = Get-Date -Minute 0 -Second 0 -Millisecond 0 function New-StableGuid([string]$Seed) { [guid]::new([Security.Cryptography.MD5]::Create().ComputeHash([Text.Encoding]::UTF8.GetBytes($Seed))) } $acme = [pscustomobject]@{ Name = 'acme.onmicrosoft.com'; Type = 'Office365' } $blue = [pscustomobject]@{ Name = 'bluewater.onmicrosoft.com'; Type = 'Office365' } function New-MockJob($Name, $Org, $NextRun, [bool]$Enabled = $true) { [pscustomobject]@{ Id = New-StableGuid $Name; Name = $Name; Organization = $Org IsEnabled = $Enabled; NextRun = $NextRun; LastStatus = 'Success' } } function New-MockSession($Job, $Start, $End, $Status, $Transferred = '0 B', [int]$Objects = 0, $Log = @()) { [pscustomobject]@{ Id = New-StableGuid "$($Job.Name)|$($Start.Ticks)"; JobId = $Job.Id; JobName = $Job.Name CreationTime = $Start; EndTime = $(if ($End) { $End } else { [datetime]::MinValue }) Status = $Status Statistics = [pscustomobject]@{ ProcessedObjects = $Objects; TransferredData = $Transferred } Log = $Log } } function New-LogEntry($Title, $Status = 'Success') { [pscustomobject]@{ Title = $Title; Status = $Status } } $global:MockVboJobs = @( (New-MockJob 'Acme - Exchange & OneDrive' $acme $now.AddHours(3)), (New-MockJob 'Acme - SharePoint & Teams' $acme $now.AddHours(5)), (New-MockJob 'Bluewater - Full Org' $blue $now.AddMinutes(30)), (New-MockJob 'Bluewater - Old Mailboxes' $blue $now.AddDays(1) $false) # disabled ) $exo, $spo, $bw, $old = $global:MockVboJobs $global:MockVboSessions = @( (New-MockSession $exo $now.AddHours(-21) $now.AddHours(-20.5) 'Success' '1.5 GB' 412 @( (New-LogEntry 'Processing mailbox jsmith@acme.com'), (New-LogEntry 'Job finished'))), (New-MockSession $exo $now.AddHours(-1) $null 'Running' '0 B' 10), (New-MockSession $spo $now.AddHours(-19) $now.AddHours(-18) 'Warning' '512 MB' 38 @( (New-LogEntry 'Processing site Marketing'), (New-LogEntry 'Item "Budget 2026.xlsx" was skipped: file is locked' 'Warning'))), (New-MockSession $bw $now.AddHours(-6) $now.AddHours(-5.9) 'Failed' '0 B' 0 @( (New-LogEntry 'Failed to connect to Exchange Online: (401) Unauthorized' 'Failed'))), (New-MockSession $bw $now.AddHours(-30) $now.AddHours(-29.5) 'Stopped' '2 GB' 120), # cancelled (New-MockSession $old $now.AddDays(-5) $now.AddDays(-5).AddHours(1) 'Success') # outside 48h lookback ) # A backup copy job (to object storage) for Acme's mailbox job $global:MockVboCopyJobs = @( [pscustomobject]@{ Id = New-StableGuid 'acme-copy'; Name = 'Acme - Exchange copy to Wasabi'; BackupJob = $exo; IsEnabled = $true; NextRun = $null } ) $global:MockVboCopySessions = @( [pscustomobject]@{ Id = New-StableGuid 'acme-copy-s1'; JobId = $global:MockVboCopyJobs[0].Id; CreationTime = $now.AddHours(-20); EndTime = $now.AddHours(-19.8) Status = 'Success'; Statistics = [pscustomobject]@{ ProcessedObjects = 412; TransferredData = '1.4 GB' }; Log = @() } ) function Get-VBOJob { $global:MockVboJobs } function Get-VBOJobSession { param($Job) $global:MockVboSessions | Where-Object { -not $Job -or $_.JobId -eq $Job.Id } } function Get-VBOOrganization { $acme, $blue } function Get-VBOCopyJob { $global:MockVboCopyJobs } function Get-VBOCopyJobSession { $global:MockVboCopySessions }