tests/Configuration.Dashboard.Tests.ps1

Describe 'Sync-NRDashboardConfiguration' {
  BeforeAll {
    Import-Module '.\NewRelicPS.Configuration.Dashboard.psm1' -Force
    Import-Module '.\NewRelicPS.Dashboards.psm1' -Force
    $apiKey = 'Fake-Test-Key'
  }

  Context 'Dashboards configured for sync' {
    BeforeAll {
      $DefinedDashboards = @(
        [PSCustomObject] @{
          sourceDashboardName = 'fake1'
          sourceDashboardId = '1234'
          updateWidgetAccountIds = $true
          destinationAccounts = @('0123456789')
          destinationBackupPath = '.\path\to\backups'
        }
      )
      Mock Copy-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' {}
      Mock Get-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' {}
      Mock Get-NRDashboardList -ModuleName 'NewRelicPS.Configuration.Dashboard' {}
    }

    It 'Copies the dashboard when a single source and destination provided' {
      Sync-NRDashboardConfiguration -APIKey $apiKey -DefinedDashboards $DefinedDashboards
      Assert-MockCalled Copy-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' -Exactly 1 -ParameterFilter {
        $DashboardId -eq '1234' -and $DestinationAccountId -eq '0123456789'
      }
    }

    It 'Updates widget account Ids when specified' {
      Sync-NRDashboardConfiguration -APIKey $apiKey -DefinedDashboards $DefinedDashboards
      Assert-MockCalled Copy-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' -Exactly 1 -ParameterFilter {
        $UpdateWidgetAccountIds -eq $true
      }
    }

    It 'Syncs the dashboard to all specified destination accounts' {
      $DefinedDashboards[0].destinationAccounts += ('9876543210')
      Sync-NRDashboardConfiguration -APIKey $apiKey -DefinedDashboards $DefinedDashboards
      Assert-MockCalled Copy-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' -Exactly 2 -ParameterFilter {
        $DashboardId -eq '1234' -and ($DestinationAccountId -eq '0123456789' -or $DestinationAccountId -eq '9876543210')
      }
    }

    It 'Syncs all specified source dashboards' {
      $DefinedDashboards += [PSCustomObject] @{
        sourceDashboardName = 'fake2'
        sourceDashboardId = '5678'
        updateWidgetAccountIds = $true
        destinationAccounts = @('0123456789')
      }
      Sync-NRDashboardConfiguration -APIKey $apiKey -DefinedDashboards $DefinedDashboards
      Assert-MockCalled Copy-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' -Exactly 2 -ParameterFilter {
        ($DashboardId -eq '1234' -or $DashboardId -eq '5678') -and $DestinationAccountId -eq '0123456789'
      }
    }

    It 'Backs up configuration before overwrite' {

      Mock Get-NRDashboardList -ModuleName 'NewRelicPS.Configuration.Dashboard' {
        Return @{
          Name = 'fake1'
          AccountId = '0123456789'
          GUID="FakeGuid1234"
        }
      }
      Mock Get-NRDashboard -ModuleName 'NewRelicPS.Configuration.Dashboard' {
        Return @{
          Name = 'Fake1'
          Account = '0123456789'
          Random = (new-guid).guid
        }
      }
      Mock Out-File -ModuleName 'NewRelicPS.Configuration.Dashboard' {}

      Sync-NRDashboardConfiguration -APIKey $apiKey -DefinedDashboards $DefinedDashboards
      Assert-MockCalled Out-File -ModuleName 'NewRelicPS.Configuration.Dashboard' -Exactly 1
    }
  }
}