public void Verify_All(ApprovalFileInfo approvalFileInfo)
        {
            System.Console.WriteLine("Testing {0}", approvalFileInfo.SourcePath);

            // need to backup the file as the approval test deletes the original file
            File.Copy(approvalFileInfo.SourcePath, approvalFileInfo.SourcePath + ".bak", true);

            using (ApprovalResults.ForScenario(approvalFileInfo.Scenario))
            {
                Approvals.VerifyFile(approvalFileInfo.SourcePath);
            }

            if (File.Exists(approvalFileInfo.SourcePath + ".bak"))
            {
                // restore the backup
                File.Copy(approvalFileInfo.SourcePath + ".bak", approvalFileInfo.SourcePath, overwrite: true);
                File.Delete(approvalFileInfo.SourcePath + ".bak");
            }
        }
        private static AdaptiveCard BuildRequestCard(User requestor, string requestorPicUri, ApprovalFileInfo fileInfo, string thumbnailUri, string recipient, string approvalId)
        {
            // Build actionable email card
            var approvalRequestCard = new AdaptiveCard();

            // Outlook-specific property on AdaptiveCard
            if (!string.IsNullOrEmpty(originatorId))
            {
                approvalRequestCard.AdditionalProperties.Add("originator", originatorId);
            }

            approvalRequestCard.Body.Add(new AdaptiveTextBlock()
            {
                Text   = "Pending Approval",
                Weight = AdaptiveTextWeight.Bolder,
                Size   = AdaptiveTextSize.Large
            });

            approvalRequestCard.Body.Add(new AdaptiveTextBlock()
            {
                Text = "Requested by"
            });


            var requestorColumnSet = new AdaptiveColumnSet();

            if (!string.IsNullOrEmpty(requestorPicUri))
            {
                var requestorPic = new AdaptiveImage()
                {
                    Style = AdaptiveImageStyle.Person,
                    Url   = new Uri(requestorPicUri)
                };

                // Outlook-specific property on Image
                requestorPic.AdditionalProperties.Add("pixelWidth", "48");

                var requestorPicCol = new AdaptiveColumn()
                {
                    Width = AdaptiveColumnWidth.Auto.ToLower()
                };

                requestorPicCol.Items.Add(requestorPic);

                requestorColumnSet.Columns.Add(requestorPicCol);
            }

            var requestorNameCol = new AdaptiveColumn()
            {
                Width = AdaptiveColumnWidth.Stretch.ToLower()
            };

            // Outlook-specific property on Column
            requestorNameCol.AdditionalProperties.Add("verticalContentAlignment", "center");

            requestorNameCol.Items.Add(new AdaptiveTextBlock()
            {
                Size = AdaptiveTextSize.Medium,
                Text = requestor.DisplayName
            });

            requestorNameCol.Items.Add(new AdaptiveTextBlock()
            {
                IsSubtle = true,
                Spacing  = AdaptiveSpacing.None,
                Text     = requestor.Mail
            });

            requestorColumnSet.Columns.Add(requestorNameCol);

            approvalRequestCard.Body.Add(requestorColumnSet);

            // File info
            approvalRequestCard.Body.Add(new AdaptiveTextBlock()
            {
                Text      = "File needing approval",
                Separator = true
            });

            var fileColumnSet = new AdaptiveColumnSet()
            {
                SelectAction = new AdaptiveOpenUrlAction()
                {
                    Title = fileInfo.Name,
                    Url   = new Uri(fileInfo.SharingUrl)
                }
            };

            if (!string.IsNullOrEmpty(thumbnailUri))
            {
                var fileThumb = new AdaptiveImage()
                {
                    Url = new Uri(thumbnailUri)
                };

                // Outlook-specific property on Image
                fileThumb.AdditionalProperties.Add("pixelWidth", "48");

                var fileThumbCol = new AdaptiveColumn()
                {
                    Width = AdaptiveColumnWidth.Auto.ToLower()
                };

                fileThumbCol.Items.Add(fileThumb);

                fileColumnSet.Columns.Add(fileThumbCol);
            }

            var fileNameCol = new AdaptiveColumn()
            {
                Width = AdaptiveColumnWidth.Stretch.ToLower()
            };

            // Outlook-specific property on Column
            fileNameCol.AdditionalProperties.Add("verticalContentAlignment", "center");

            fileNameCol.Items.Add(new AdaptiveTextBlock()
            {
                Size = AdaptiveTextSize.Medium,
                Text = fileInfo.Name
            });

            fileNameCol.Items.Add(new AdaptiveTextBlock()
            {
                IsSubtle = true,
                Spacing  = AdaptiveSpacing.None,
                Text     = "(tap to view)"
            });

            fileColumnSet.Columns.Add(fileNameCol);

            approvalRequestCard.Body.Add(fileColumnSet);

            // Respond button

            // Response form (hiddden initially)
            var responseForm = new AdaptiveCard();

            responseForm.AdditionalProperties.Add("style", "emphasis");

            responseForm.Body.Add(new AdaptiveTextInput()
            {
                Id          = "notes",
                IsMultiline = true,
                Placeholder = "Enter any notes for the requestor"
            });

            responseForm.Actions.Add(new AdaptiveHttpAction()
            {
                Title  = "Approve",
                Method = AdaptiveHttpActionMethod.POST,
                Url    = new Uri($"{(string.IsNullOrEmpty(ngrokUrl) ? actionBaseUrl : ngrokUrl) }/api/responses"),
                Body   = $@"{{ ""userEmail"": ""{recipient}"", ""approvalId"": ""{approvalId}"", ""response"": ""approved"", ""notes"": ""{{{{notes.value}}}}"" }}s"
            });

            responseForm.Actions.Add(new AdaptiveHttpAction()
            {
                Title  = "Reject",
                Method = AdaptiveHttpActionMethod.POST,
                Url    = new Uri($"{(string.IsNullOrEmpty(ngrokUrl) ? actionBaseUrl : ngrokUrl)}/api/responses"),
                Body   = $@"{{ ""userEmail"": ""{recipient}"", ""approvalId"": ""{approvalId}"", ""response"": ""rejected"", ""notes"": ""{{{{notes.value}}}}"" }}"
            });

            approvalRequestCard.Actions.Add(new AdaptiveShowCardAction()
            {
                Title = "Respond",
                Card  = responseForm
            });

            return(approvalRequestCard);
        }