Utility.Tests.ps1

using module .\Utility.psm1

Describe "IsValidEmail" -Tags "Unit" {
  It "return true for valid email" {
    $utility = Get-Utility
    $utility.IsValidEmail("user@contoso.com") | Should be $true
  }
  It "return false for invalid email" {
    $utility = Get-Utility
    $utility.IsValidEmail("user@d@contoso.com") | Should be $false
  }
  It "return false for empty input" {
    $utility = Get-Utility
    $utility.IsValidEmail("") | Should be $false
  }
}

Describe "ParseAccessToken" -Tags "Unit" {
  It "can parse user accessToken" {
    $accessToken = "eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlJcFh2d3c2LTB1a0I5M3VXWjlfSUwtTC1ZdU5jNGY0LWRYTFVRWVZvRVUiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL291dGxvb2sub2ZmaWNlMzY1LmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E0NDVmYjA4LTUwODQtNGYxZi1hNjQ1LTZiZGUxNTNlZDEzNy8iLCJpYXQiOjE2ODExNzg1NjIsIm5iZiI6MTY4MTE3ODU2MiwiZXhwIjoxNjgxMTg0MTY4LCJhY2N0IjowLCJhY3IiOiIxIiwiYWlvIjoiQVRRQXkvOFRBQUFBTGw1MDQ0Q1F2d1FqOE9oTk00MzQ3YUtUZ3JUUkJRY0REbDl5RlJZMHFxZ2NlSDlXejd1R3ZOcDBmdytDcFRudiIsImFtciI6WyJwd2QiXSwiYXBwX2Rpc3BsYXluYW1lIjoiUG9wSW1hcCIsImFwcGlkIjoiMjEzZGMwYzItYTNkNi00MDE1LTljMGUtNzZlZWM2M2VkYTM4IiwiYXBwaWRhY3IiOiIwIiwiZW5mcG9saWRzIjpbXSwiZmFtaWx5X25hbWUiOiJWYW5jZSIsImdpdmVuX25hbWUiOiJBZGVsZSIsImlwYWRkciI6IjE2Ny4yMjAuMjU1LjEwIiwibmFtZSI6IkFkZWxlIFZhbmNlIiwib2lkIjoiY2ExODA5YjctYjYxOC00OWU1LWE1ZjgtZGQyZDE5MGVkNTVkIiwicHVpZCI6IjEwMDMyMDAyMzNGMTNEOUEiLCJyaCI6IjAuQVZZQUNQdEZwSVJRSDAtbVJXdmVGVDdSTndJQUFBQUFBUEVQemdBQUFBQUFBQUNmQU5BLiIsInNjcCI6IklNQVAuQWNjZXNzQXNVc2VyLkFsbCBVc2VyLlJlYWQiLCJzaWQiOiI2NTBiNzUwYi03Y2ZmLTQ0Y2ItOWUzOS02ZDM0M2ZkMjg0ZTciLCJzdWIiOiJHa3MtMjJoeGhaYkZlQmNuaDR4T0RIMi0tNXU5bUpoaWV0MXFUc3dSOTU0IiwidGlkIjoiYTQ0NWZiMDgtNTA4NC00ZjFmLWE2NDUtNmJkZTE1M2VkMTM3IiwidW5pcXVlX25hbWUiOiJBZGVsZVZATTM2NXg0Mzk2MzYwMi5Pbk1pY3Jvc29mdC5jb20iLCJ1cG4iOiJBZGVsZVZATTM2NXg0Mzk2MzYwMi5Pbk1pY3Jvc29mdC5jb20iLCJ1dGkiOiJIWHBtUGJEX2QwdVA0QXY3Qmp3c0FRIiwidmVyIjoiMS4wIiwid2lkcyI6WyJiNzlmYmY0ZC0zZWY5LTQ2ODktODE0My03NmIxOTRlODU1MDkiXX0.MaTH3mKgSaQdo_x0i2-vjrapFjY9AWsRZZIZqm5gO6fIQgNbEJokvQuPcKI1XaJ91qegms_PW19w66t9DC4QCEN2VfeBJPn9xvdXt2P31Yb9_XtWvjeWWEB6PtVwbABMTGouWve4-Yq4dEEzZjVAzVWvoh-zjAw7QKGL4RxT-wOzfhj_4ZrHiePGdRCApjxQbL0OEYEcmKD8UxstkTMxzspoLVfmgyJeZ7IAsGsqiZm8j7wb9-QPqji_a8To2Ch0k9vEliODi45zPdtMciIOw1-cINh3ZOcJg8uQejP3NzLco9nXI3oJ34xq7o2uaIOK0P15RWkFsR7aQ7vA5J9EyA"
    $utility = Get-Utility
    $tokenObject = $utility.ParseAccessToken($accessToken)
    $tokenObject.scp | Should be "IMAP.AccessAsUser.All User.Read"
    $tokenObject.aud | Should be "https://outlook.office365.com"
  }
  It "can parse app accessToken" {
    $accessToken = "eyJ0eXAiOiJKV1QiLCJub25jZSI6Ikg3TUlZV0hPc3gxOVB3UmpGdjRWUGtyY2gtMWZhQVZDaTBTUExHZDdncmMiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL291dGxvb2sub2ZmaWNlMzY1LmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E0NDVmYjA4LTUwODQtNGYxZi1hNjQ1LTZiZGUxNTNlZDEzNy8iLCJpYXQiOjE2ODExNDIzNzQsIm5iZiI6MTY4MTE0MjM3NCwiZXhwIjoxNjgxMTQ2Mjc0LCJhaW8iOiJFMlpnWUZoeW42SEEvTkxQT05XUElVdW1XUXFsQXdBPSIsImFwcF9kaXNwbGF5bmFtZSI6IlBvcEltYXAiLCJhcHBpZCI6IjIxM2RjMGMyLWEzZDYtNDAxNS05YzBlLTc2ZWVjNjNlZGEzOCIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E0NDVmYjA4LTUwODQtNGYxZi1hNjQ1LTZiZGUxNTNlZDEzNy8iLCJvaWQiOiI3OTY1NTIwYy01YmRmLTQ3MDAtODVjNi0xMDZjYThmOWZmMzAiLCJyaCI6IjAuQVZZQUNQdEZwSVJRSDAtbVJXdmVGVDdSTndJQUFBQUFBUEVQemdBQUFBQUFBQUNmQUFBLiIsInJvbGVzIjpbIlBPUC5BY2Nlc3NBc0FwcCIsIklNQVAuQWNjZXNzQXNBcHAiXSwic2lkIjoiNjFiY2QzZTEtM2FmMS00MGQyLWJhMTQtNTVjZmFhYjA5ZjMzIiwic3ViIjoiNzk2NTUyMGMtNWJkZi00NzAwLTg1YzYtMTA2Y2E4ZjlmZjMwIiwidGlkIjoiYTQ0NWZiMDgtNTA4NC00ZjFmLWE2NDUtNmJkZTE1M2VkMTM3IiwidXRpIjoidWhBeG42ZHRORUtoNF9pUWowZ0RBUSIsInZlciI6IjEuMCIsIndpZHMiOlsiMDk5N2ExZDAtMGQxZC00YWNiLWI0MDgtZDVjYTczMTIxZTkwIl19.YSVp914tiLU80AYZm_mIQZnwPX7bVrcyaTYVoljroMTVcix70c5ULsJFJoX0dX8pDTqXNs2HUkxIeSZLnLmZXEedefODTl944FLN0EoXCHEbaPsM_XcVez-3iMTLsDpVkdvVMmiI9d1i1TKEySbCilET9-UAgXSqGW1WWBmmEarfai5p_YDQUDWK97grewRnzYiSSHc8W_6axyFJw4dIyryfB6yoGRc8I-Vnnk1QNOY7AvieQll5aR0XRiOSpiqB2e5cn-rSXyLRIZS3z2g3foBQ86yA926wqXdfQ-QFCCzZvTMDdDxUJ27UagEer2tspijrzAFZktpmQ4QoowBI5Q"
    $utility = Get-Utility
    $tokenObject = $utility.ParseAccessToken($accessToken)
    $tokenObject.roles.Contains("IMAP.AccessAsApp") | Should be $true
    
  }
}

Describe "BuildO365Token" -Tags "Unit" {
  It "combines upn and access token" {
    $accessToken = "eyJ0eXAiOiJKV1QiLCJub25jZSI6ImR5ZGtITXZuUHZrc1ROZ3Z3QWdvVk1aaFdoekMtTVJNeE9HMDctVmlIcUUiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiJodHRwczovL291dGxvb2sub2ZmaWNlLmNvbSIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E0NDVmYjA4LTUwODQtNGYxZi1hNjQ1LTZiZGUxNTNlZDEzNy8iLCJpYXQiOjE2NzkxNDQ5OTEsIm5iZiI6MTY3OTE0NDk5MSwiZXhwIjoxNjc5MTUwNjY0LCJhY2N0IjowLCJhY3IiOiIxIiwiYWlvIjoiQVRRQXkvOFRBQUFBQlh0Y05DVEZOTUJUcTgzK0ZzWTl2Q2U0eXoxVE43TG15dTJDam9QR1JBREZ2TVFoc1dYVG40bHAvRDJEYzRQRyIsImFtciI6WyJwd2QiXSwiYXBwX2Rpc3BsYXluYW1lIjoiUG9wSW1hcF9NIiwiYXBwaWQiOiI2YjdiNDFjNi0wYzc3LTRlYjEtYTEyZi0xMzNkYmI3ZjgzYTAiLCJhcHBpZGFjciI6IjAiLCJlbmZwb2xpZHMiOltdLCJmYW1pbHlfbmFtZSI6IkFkbWluaXN0cmF0b3IiLCJnaXZlbl9uYW1lIjoiTU9EIiwiaXBhZGRyIjoiMTY3LjIyMC4yNTUuMTAiLCJuYW1lIjoiTU9EIEFkbWluaXN0cmF0b3IiLCJvaWQiOiIxM2UxZjZjMy1lYmRhLTQ4ZTItOTAxZS0zN2VkYzZkNWU3ZjAiLCJwdWlkIjoiMTAwMzIwMDIzNDFDM0FEMCIsInJoIjoiMC5BVllBQ1B0RnBJUlFIMC1tUld2ZUZUN1JOd0lBQUFBQUFQRVB6Z0FBQUFBQUFBQ2ZBS2suIiwic2NwIjoiSU1BUC5BY2Nlc3NBc1VzZXIuQWxsIFBPUC5BY2Nlc3NBc1VzZXIuQWxsIiwic2lkIjoiMWQ1ZDE4NzAtMjEyNy00YTYzLWI0MjctNzE0YmJiZDRiMmZiIiwic3ViIjoiUUxwR05VUFVqTllzak10STJZN3RYeVFuLXJGSF9jbTJBQzhTTTB2N2xfbyIsInRpZCI6ImE0NDVmYjA4LTUwODQtNGYxZi1hNjQ1LTZiZGUxNTNlZDEzNyIsInVuaXF1ZV9uYW1lIjoiYWRtaW5ATTM2NXg0Mzk2MzYwMi5vbm1pY3Jvc29mdC5jb20iLCJ1cG4iOiJhZG1pbkBNMzY1eDQzOTYzNjAyLm9ubWljcm9zb2Z0LmNvbSIsInV0aSI6InJMeGw0ckZkNGttVl94aXFRdjA5QUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbIjYyZTkwMzk0LTY5ZjUtNDIzNy05MTkwLTAxMjE3NzE0NWUxMCIsImI3OWZiZjRkLTNlZjktNDY4OS04MTQzLTc2YjE5NGU4NTUwOSJdfQ.PCLnllA4vVrKH21gD3MVWw6oAK8uBoMSmaJwCs3nDGQwPh6Yy_NXBn6CHutDm4ebDruT46WoFoFoO2oUaRbrJu7rJxNPpZMFHly8fkn9sYQPbd6AAX8lCk38nwDRl8b7QlSvtWI0HYlSoV329R1-ymS1KvuujjnvNPgQR71onvp4DU4pTcPzIU0uo937LY9S5UyjhpudtnVAYi9F6dcMuzaX4dHctCEgr9U9jZ2Hfv631sBPZb30uEIuJB76QgC2DMjHsUQgiflvkwlIz0YPX_CTtUZuQZqjiiC2RZDT1luCh1PRVwZKJGDTqnhDFQiMQF8fFsmyR1qZpqz1GDj-NA"
    $upn = "admin@M365x43963602.onmicrosoft.com"
    $utility = Get-Utility
    $token = $utility.BuildO365Token($accessToken, $upn)
    $token | Should be "dXNlcj1hZG1pbkBNMzY1eDQzOTYzNjAyLm9ubWljcm9zb2Z0LmNvbQFhdXRoPUJlYXJlciBleUowZVhBaU9pSktWMVFpTENKdWIyNWpaU0k2SW1SNVpHdElUWFp1VUhacmMxUk9aM1ozUVdkdlZrMWFhRmRvZWtNdFRWSk5lRTlITURjdFZtbEljVVVpTENKaGJHY2lPaUpTVXpJMU5pSXNJbmcxZENJNklpMUxTVE5ST1c1T1VqZGlVbTltZUcxbFdtOVljV0pJV2tkbGR5SXNJbXRwWkNJNklpMUxTVE5ST1c1T1VqZGlVbTltZUcxbFdtOVljV0pJV2tkbGR5SjkuZXlKaGRXUWlPaUpvZEhSd2N6b3ZMMjkxZEd4dmIyc3ViMlptYVdObExtTnZiU0lzSW1semN5STZJbWgwZEhCek9pOHZjM1J6TG5kcGJtUnZkM011Ym1WMEwyRTBORFZtWWpBNExUVXdPRFF0TkdZeFppMWhOalExTFRaaVpHVXhOVE5sWkRFek55OGlMQ0pwWVhRaU9qRTJOemt4TkRRNU9URXNJbTVpWmlJNk1UWTNPVEUwTkRrNU1Td2laWGh3SWpveE5qYzVNVFV3TmpZMExDSmhZMk4wSWpvd0xDSmhZM0lpT2lJeElpd2lZV2x2SWpvaVFWUlJRWGt2T0ZSQlFVRkJRbGgwWTA1RFZFWk9UVUpVY1RnekswWnpXVGwyUTJVMGVYb3hWRTQzVEcxNWRUSkRhbTlRUjFKQlJFWjJUVkZvYzFkWVZHNDBiSEF2UkRKRVl6UlFSeUlzSW1GdGNpSTZXeUp3ZDJRaVhTd2lZWEJ3WDJScGMzQnNZWGx1WVcxbElqb2lVRzl3U1cxaGNGOU5JaXdpWVhCd2FXUWlPaUkyWWpkaU5ERmpOaTB3WXpjM0xUUmxZakV0WVRFeVppMHhNek5rWW1JM1pqZ3pZVEFpTENKaGNIQnBaR0ZqY2lJNklqQWlMQ0psYm1ad2IyeHBaSE1pT2x0ZExDSm1ZVzFwYkhsZmJtRnRaU0k2SWtGa2JXbHVhWE4wY21GMGIzSWlMQ0puYVhabGJsOXVZVzFsSWpvaVRVOUVJaXdpYVhCaFpHUnlJam9pTVRZM0xqSXlNQzR5TlRVdU1UQWlMQ0p1WVcxbElqb2lUVTlFSUVGa2JXbHVhWE4wY21GMGIzSWlMQ0p2YVdRaU9pSXhNMlV4Wmpaak15MWxZbVJoTFRRNFpUSXRPVEF4WlMwek4yVmtZelprTldVM1pqQWlMQ0p3ZFdsa0lqb2lNVEF3TXpJd01ESXpOREZETTBGRU1DSXNJbkpvSWpvaU1DNUJWbGxCUTFCMFJuQkpVbEZJTUMxdFVsZDJaVVpVTjFKT2QwbEJRVUZCUVVGUVJWQjZaMEZCUVVGQlFVRkJRMlpCUzJzdUlpd2ljMk53SWpvaVNVMUJVQzVCWTJObGMzTkJjMVZ6WlhJdVFXeHNJRkJQVUM1QlkyTmxjM05CYzFWelpYSXVRV3hzSWl3aWMybGtJam9pTVdRMVpERTROekF0TWpFeU55MDBZVFl6TFdJME1qY3ROekUwWW1KaVpEUmlNbVppSWl3aWMzVmlJam9pVVV4d1IwNVZVRlZxVGxsemFrMTBTVEpaTjNSWWVWRnVMWEpHU0Y5amJUSkJRemhUVFRCMk4yeGZieUlzSW5ScFpDSTZJbUUwTkRWbVlqQTRMVFV3T0RRdE5HWXhaaTFoTmpRMUxUWmlaR1V4TlRObFpERXpOeUlzSW5WdWFYRjFaVjl1WVcxbElqb2lZV1J0YVc1QVRUTTJOWGcwTXprMk16WXdNaTV2Ym0xcFkzSnZjMjltZEM1amIyMGlMQ0oxY0c0aU9pSmhaRzFwYmtCTk16WTFlRFF6T1RZek5qQXlMbTl1YldsamNtOXpiMlowTG1OdmJTSXNJblYwYVNJNkluSk1lR3cwY2taa05HdHRWbDk0YVhGUmRqQTVRVUVpTENKMlpYSWlPaUl4TGpBaUxDSjNhV1J6SWpwYklqWXlaVGt3TXprMExUWTVaalV0TkRJek55MDVNVGt3TFRBeE1qRTNOekUwTldVeE1DSXNJbUkzT1daaVpqUmtMVE5sWmprdE5EWTRPUzA0TVRRekxUYzJZakU1TkdVNE5UVXdPU0pkZlEuUENMbmxsQTR2VnJLSDIxZ0QzTVZXdzZvQUs4dUJvTVNtYUp3Q3MzbkRHUXdQaDZZeV9OWEJuNkNIdXREbTRlYkRydVQ0NldvRm9Gb08yb1VhUmJySnU3ckp4TlBwWk1GSGx5OGZrbjlzWVFQYmQ2QUFYOGxDazM4bndEUmw4YjdRbFN2dFdJMEhZbFNvVjMyOVIxLXltUzFLdnV1ampudk5QZ1FSNzFvbnZwNERVNHBUY1B6SVUwdW85MzdMWTlTNVV5amhwdWR0blZBWWk5RjZkY011emFYNGRIY3RDRWdyOVU5aloySGZ2NjMxc0JQWmIzMHVFSXVKQjc2UWdDMkRNakhzVVFnaWZsdmt3bEl6MFlQWF9DVHRVWnVRWnFqaWlDMlJaRFQxbHVDaDFQUlZ3WktKR0RUcW5oREZRaU1RRjhmRnNteVIxcVpwcXoxR0RqLU5BAQE="
  }
}