public void EnsureVariableNameIsNotReserved_AppendsTheAtSignOnCsharpKeywords() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); var keyword = "event"; //Act var result = CommonGenerator.EnsureVariableNameIsNotReserved(keyword, expressions); //Assert Assert.Equal("@event", result); }
public void EnsureVariableNameIsNotReserved_DoesNotModifyVariableNamesIfNotReserved() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); var keyword = "people"; //Act var result = CommonGenerator.EnsureVariableNameIsNotReserved(keyword, expressions); //Assert Assert.Equal("people", result); }
//This tests asserts that we can properly generate snippets with some property originally set to null. public void GeneratesSnippetsWithRecurrencePropertySetToNull() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //This request example is present at the link //https://docs.microsoft.com/en-us/graph/api/event-update?view=graph-rest-1.0&tabs=http#request const string messageJsonObject = "{\r\n" + " \"originalStartTimeZone\": \"originalStartTimeZone-value\",\r\n" + " \"originalEndTimeZone\": \"originalEndTimeZone-value\",\r\n" + " \"responseStatus\": {\r\n" + " \"response\": \"\",\r\n" + " \"time\": \"datetime-value\"\r\n" + " },\r\n" + " \"recurrence\": null,\r\n" + //property set to null in request object " \"iCalUId\": \"iCalUId-value\",\r\n" + " \"reminderMinutesBeforeStart\": 99,\r\n" + " \"isReminderOn\": true\r\n" + "}"; var requestPayload = new HttpRequestMessage(HttpMethod.Patch, "https://graph.microsoft.com/v1.0/me/events/{id}") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var @event = new Event\r\n" + "{\r\n" + "\tOriginalStartTimeZone = \"originalStartTimeZone-value\",\r\n" + "\tOriginalEndTimeZone = \"originalEndTimeZone-value\",\r\n" + "\tResponseStatus = new ResponseStatus\r\n" + "\t{\r\n" + "\t\tResponse = ResponseType.None,\r\n" + "\t\tTime = DateTimeOffset.Parse(\"datetime-value\")\r\n" + //the dateTimeOffset appropriately parsed "\t},\r\n" + "\tRecurrence = null,\r\n" + //the property has been appropriately set to null "\tICalUId = \"iCalUId-value\",\r\n" + "\tReminderMinutesBeforeStart = 99,\r\n" + "\tIsReminderOn = true\r\n" + "};\r\n" + "\r\n" + "await graphClient.Me.Events[\"{id}\"]\n" + "\t.Request()\n" + "\t.UpdateAsync(@event);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
public void GenerateQuerySection_ShouldReturnAppropriateCSharpTopExpression() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //no query present var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/events?$top=5"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act var result = CommonGenerator.GenerateQuerySection(snippetModel, expressions); //Assert string is empty Assert.Equal("\n\t.Top(5)", result); }
public void GenerateQuerySection_ShouldReturnAppropriateCSharpFilterExpression() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //no query present var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/users?$filter=startswith(givenName, 'J')"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act var result = CommonGenerator.GenerateQuerySection(snippetModel, expressions); //Assert string is empty Assert.Equal("\n\t.Filter(\"startswith(givenName, 'J')\")", result); }
public void GenerateQuerySection_ShouldReturnAppropriateCSharpSelectExpression() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //no query present var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/users/{id}?$select=displayName,givenName,postalCode"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act var result = CommonGenerator.GenerateQuerySection(snippetModel, expressions); //Assert string is empty Assert.Equal("\n\t.Select(\"displayName,givenName,postalCode\")", result); }
//This tests asserts that we can properly generate snippets with DateTime strings present and parse them appropriately public void GeneratesSnippetsWithDateTimeStrings() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); const string messageJsonObject = "{\r\n" + " \"receivedDateTime\": \"datetime-value\",\r\n" + //dateTimeOffsetObject " \"sentDateTime\": \"datetime-value\",\r\n" + //dateTime to be parsed //https://docs.microsoft.com/en-us/graph/api/resources/message?view=graph-rest-1.0#properties " \"hasAttachments\": true,\r\n" + " \"subject\": \"subject-value\",\r\n" + " \"body\": {\r\n" + " \"contentType\": \"\",\r\n" + " \"content\": \"content-value\"\r\n" + " },\r\n" + " \"bodyPreview\": \"bodyPreview-value\"\r\n" + "}"; var requestPayload = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/me/mailFolders/{id}/messages") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var message = new Message\r\n" + "{\r\n" + "\tReceivedDateTime = DateTimeOffset.Parse(\"datetime-value\"),\r\n" + "\tSentDateTime = DateTimeOffset.Parse(\"datetime-value\"),\r\n" + "\tHasAttachments = true,\r\n" + "\tSubject = \"subject-value\",\r\n" + "\tBody = new ItemBody\r\n" + "\t{\r\n" + "\t\tContentType = BodyType.Text,\r\n" + "\t\tContent = \"content-value\"\r\n" + "\t},\r\n" + "\tBodyPreview = \"bodyPreview-value\"\r\n" + "};\r\n" + "\r\n" + "await graphClient.Me.MailFolders[\"{id}\"].Messages\n" + "\t.Request()\n" + "\t.AddAsync(message);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
public void GenerateQuerySection_ShouldReturnAppropriateCSharpRequestHeaderExpressionWithEscapedDoubleQuotes() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //no query present var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/events"); requestPayload.Headers.Add("Prefer", "outlook.timezone=\"Pacific Standard Time\""); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act var result = CommonGenerator.GenerateQuerySection(snippetModel, expressions); //Assert string is empty Assert.Equal("\n\t.Header(\"Prefer\",\"outlook.timezone=\\\"Pacific Standard Time\\\"\")", result); }
public void GenerateQuerySection_ShouldReturnAppropriateCSharpRequestHeaderExpression() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //no query present var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/users/{id}"); requestPayload.Headers.Add("Prefer", "kenya-timezone"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act var result = CommonGenerator.GenerateQuerySection(snippetModel, expressions); //Assert string is empty Assert.Equal("\n\t.Header(\"Prefer\",\"kenya-timezone\")", result); }
//This test asserts that a request for a structural properties of type stream are generated in the normal url like fashion as // streams have the request builders generated. public void GeneratesSnippetsWithStructuralPropertiesOfTypeStream() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/drive/items/{item-id}/content"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var stream = await graphClient.Me.Drive.Items[\"{item-id}\"].Content\n" + "\t.Request()\n" + "\t.GetAsync();"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets with $ref operator inside it public void GeneratesSnippetsWithReferenceSegmentInPath() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); var requestPayload = new HttpRequestMessage(HttpMethod.Delete, "https://graph.microsoft.com/v1.0/groups/{id}/owners/{id}/$ref"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "await graphClient.Groups[\"{id}\"].Owners[\"{id}\"].Reference\n" + "\t.Request()\n" + "\t.DeleteAsync();"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets from json objects with nested objects inside them. public void RecursivelyGeneratesNestedPasswordProfileObjectFromJson() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //json string with nested object properties const string userJsonObject = "{\r\n \"accountEnabled\": true,\r\n " + "\"displayName\": \"displayName-value\",\r\n " + "\"mailNickname\": \"mailNickname-value\",\r\n " + "\"userPrincipalName\": \"[email protected]\",\r\n " + " \"passwordProfile\" : {\r\n \"forceChangePasswordNextSignIn\": true,\r\n \"password\": \"password-value\"\r\n }\r\n}";//nested passwordProfile Object var requestPayload = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/users") { Content = new StringContent(userJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var user = new User\r\n" + "{\r\n" + "\tAccountEnabled = true,\r\n" + "\tDisplayName = \"displayName-value\",\r\n" + "\tMailNickname = \"mailNickname-value\",\r\n" + "\tUserPrincipalName = \"[email protected]\",\r\n" + "\tPasswordProfile = new PasswordProfile\r\n" + //object with nested properties "\t{\r\n" + "\t\tForceChangePasswordNextSignIn = true,\r\n" + //nested object property "\t\tPassword = \"password-value\"\r\n" + //nested object property "\t}\r\n" + "};\r\n\r\n" + "await graphClient.Users\n" + "\t.Request()\n" + "\t.AddAsync(user);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can properly generate snippets for odata actions with parameters public void GeneratesSnippetsForOdataActionsWithParameters() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); var requestPayload = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/drive/items/{id}/workbook/worksheets/{id|name}/range(address='A1:B2')"); var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var workbookRange = await graphClient.Me.Drive.Items[\"{id}\"].Workbook.Worksheets[\"{id|name}\"]\n" + "\t.Range(\"A1:B2\")\n" + //parameter has double quotes "\t.Request()\n" + "\t.GetAsync();"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets with enums separate with Or binary action public void GeneratesEnumTypesWithOrSeparatorIfEnumsAreMany() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //json string with nested object array const string messageJsonObject = "{\r\n " + "\"EmailAddresses\": [\r\n" + " \"[email protected]\", \r\n" + " \"[email protected]\"\r\n" + " ],\r\n" + " \"MailTipsOptions\": \"automaticReplies, mailboxFullStatus\"\r\n" + //this is an enum that should be ORed together "}"; var requestPayload = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/me/getMailTips") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var emailAddresses = new List<String>()\r\n" + "{\r\n" + "\t\"[email protected]\",\r\n" + "\t\"[email protected]\"\r\n" + "};\r\n" + "\r\n" + "var mailTipsOptions = MailTipsType.AutomaticReplies | MailTipsType.MailboxFullStatus;\r\n" + //Asserting that this OR is done "\r\n" + "await graphClient.Me\n" + "\t.GetMailTips(emailAddresses,mailTipsOptions)\n" + "\t.Request()\n" + "\t.PostAsync();"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets from json objects with nested arrays inside them. public void RecursivelyGeneratesNestedPhonesListFromJsonObject() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //json string with nested objects string array const string userJsonObject = "{\r\n \"accountEnabled\": true,\r\n " + "\"businessPhones\": [\r\n \"businessPhones-value\",\"businessPhones-value2\",\"businessPhones-value3\"\r\n ],\r\n " +//nested ArrayObject with 3 items "\"city\": \"city-value\"\r\n}"; var requestPayload = new HttpRequestMessage(HttpMethod.Patch, "https://graph.microsoft.com/v1.0/me") { Content = new StringContent(userJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var user = new User\r\n" + "{\r\n" + "\tAccountEnabled = true,\r\n" + "\tBusinessPhones = new List<String>()\r\n" + //Array object "\t{\r\n" + "\t\t\"businessPhones-value\",\r\n" + //nested array item "\t\t\"businessPhones-value2\",\r\n" + //nested array item "\t\t\"businessPhones-value3\"\r\n" + //nested array item "\t},\r\n" + "\tCity = \"city-value\"\r\n" + "};\r\n\r\n" + "await graphClient.Me\n" + "\t.Request()\n" + "\t.UpdateAsync(user);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets with $ref that adds/creates references with multiple additionalData inserted public void GeneratesSnippetsAddingReferencesToObjectWithExtraAdditionalData() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); const string messageJsonObject = "{\r\n " + "\"@odata.id\": \"https://graph.microsoft.com/v1.0/users/{id}\" ," + "\"@odata.context\": \"https://graph.microsoft.com/v1.0/$metadata#users/$entity\"" + "\r\n}"; var requestPayload = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/groups/{id}/owners/$ref") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var directoryObject = new DirectoryObject\r\n" + "{\r\n" + "\tId = \"{id}\",\r\n" + "\tAdditionalData = new Dictionary<string, object>()\r\n" + "\t{\r\n" + "\t\t{\"@odata.context\",\"https://graph.microsoft.com/v1.0/$metadata#users/$entity\"}\r\n" + "\t}\r\n" + "};\r\n" + "\r\n" + "await graphClient.Groups[\"{id}\"].Owners.References" + "\n\t.Request()" + "\n\t.AddAsync(directoryObject);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can properly generate snippets and List that is not a string type but of Enums public void GeneratesSnippetsForEnumTypedList() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //This request example is present at the link //https://docs.microsoft.com/en-us/graph/api/user-post-events?view=graph-rest-1.0&tabs=http#request-3 const string messageJsonObject = "{\r\n" + " \"subject\": \"Let's go for lunch\",\r\n" + " \"body\": {\r\n" + " \"contentType\": \"HTML\",\r\n" + " \"content\": \"Does noon time work for you?\"\r\n" + " },\r\n" + " \"start\": {\r\n" + " \"dateTime\": \"2017-09-04T12:00:00\",\r\n" + " \"timeZone\": \"Pacific Standard Time\"\r\n" + " },\r\n" + " \"end\": {\r\n" + " \"dateTime\": \"2017-09-04T14:00:00\",\r\n" + " \"timeZone\": \"Pacific Standard Time\"\r\n" + " },\r\n" + " \"recurrence\": {\r\n" + " \"pattern\": {\r\n" + " \"type\": \"weekly\",\r\n" + " \"interval\": 1,\r\n" + " \"daysOfWeek\": [ \"Monday\" ]\r\n" + //this is a list of enums " },\r\n" + " \"range\": {\r\n" + " \"type\": \"endDate\",\r\n" + " \"startDate\": \"2017-09-04\",\r\n" + //Date Type " \"endDate\": \"2017-12-31\"\r\n" + //Date Type " }\r\n" + " },\r\n" + " \"location\":{\r\n" + " \"displayName\":\"Harry's Bar\"\r\n" + " },\r\n" + " \"attendees\": [\r\n" + " {\r\n" + " \"emailAddress\": {\r\n" + " \"address\":\"[email protected]\",\r\n" + " \"name\": \"Adele Vance\"\r\n" + " },\r\n" + " \"type\": \"required\"\r\n" + " }\r\n" + " ]\r\n" + "}"; var requestPayload = new HttpRequestMessage(HttpMethod.Patch, "https://graph.microsoft.com/v1.0/me/events/{id}") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var @event = new Event\r\n" + "{\r\n" + "\tSubject = \"Let's go for lunch\",\r\n" + "\tBody = new ItemBody\r\n" + "\t{\r\n" + "\t\tContentType = BodyType.Html,\r\n" + "\t\tContent = \"Does noon time work for you?\"\r\n" + "\t},\r\n" + "\tStart = new DateTimeTimeZone\r\n" + "\t{\r\n" + "\t\tDateTime = \"2017-09-04T12:00:00\",\r\n" + "\t\tTimeZone = \"Pacific Standard Time\"\r\n" + "\t},\r\n" + "\tEnd = new DateTimeTimeZone\r\n" + "\t{\r\n" + "\t\tDateTime = \"2017-09-04T14:00:00\",\r\n" + "\t\tTimeZone = \"Pacific Standard Time\"\r\n" + "\t},\r\n" + "\tRecurrence = new PatternedRecurrence\r\n" + "\t{\r\n" + "\t\tPattern = new RecurrencePattern\r\n" + "\t\t{\r\n" + "\t\t\tType = RecurrencePatternType.Weekly,\r\n" + "\t\t\tInterval = 1,\r\n" + "\t\t\tDaysOfWeek = new List<DayOfWeek>()\r\n" + //list of DayOfWeek enum "\t\t\t{\r\n" + "\t\t\t\tDayOfWeek.Monday\r\n" + //member of list "\t\t\t}\r\n" + "\t\t},\r\n" + "\t\tRange = new RecurrenceRange\r\n" + "\t\t{\r\n" + "\t\t\tType = RecurrenceRangeType.EndDate,\r\n" + "\t\t\tStartDate = new Date(2017,9,4),\r\n" + //Date Type "\t\t\tEndDate = new Date(2017,12,31)\r\n" + //Date Type "\t\t}\r\n" + "\t},\r\n" + "\tLocation = new Location\r\n" + "\t{\r\n" + "\t\tDisplayName = \"Harry's Bar\"\r\n" + "\t},\r\n" + "\tAttendees = new List<Attendee>()\r\n" + "\t{\r\n" + "\t\tnew Attendee\r\n" + "\t\t{\r\n" + "\t\t\tEmailAddress = new EmailAddress\r\n" + "\t\t\t{\r\n" + "\t\t\t\tAddress = \"[email protected]\",\r\n" + "\t\t\t\tName = \"Adele Vance\"\r\n" + "\t\t\t},\r\n" + "\t\t\tType = AttendeeType.Required\r\n" + "\t\t}\r\n" + "\t}\r\n};\r\n" + "\r\n" + "await graphClient.Me.Events[\"{id}\"]\n" + "\t.Request()\n" + "\t.UpdateAsync(@event);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }
//This tests asserts that we can generate snippets from json objects with nested object lists(JArray) inside them. public void RecursivelyGeneratesNestedRecipientListObjectsFromJson() { //Arrange LanguageExpressions expressions = new CSharpExpressions(); //json string with nested object array const string messageJsonObject = "{\r\n " + "\"subject\":\"Did you see last night's game?\",\r\n" + "\"importance\":\"Low\",\r\n" + "\"body\":{\r\n" + "\"contentType\":\"HTML\",\r\n" + "\"content\":\"They were <b>awesome</b>!\"\r\n" + "},\r\n" + "\"toRecipients\":[\r\n" + "{\r\n" + "\"emailAddress\":{\r\n" + "\"address\":\"[email protected]\"\r\n" + "}\r\n" + "},\r\n" + "{\r\n" + "\"emailAddress\":{\r\n" + "\"address\":\"[email protected]\"\r\n" + "}\r\n" + "}\r\n" + "]\r\n" + "}"; var requestPayload = new HttpRequestMessage(HttpMethod.Post, "https://graph.microsoft.com/v1.0/me/messages") { Content = new StringContent(messageJsonObject) }; var snippetModel = new SnippetModel(requestPayload, ServiceRootUrl, _edmModel); //Act by generating the code snippet var result = CSharpGenerator.GenerateCodeSnippet(snippetModel, expressions); //Assert code snippet string matches expectation const string expectedSnippet = "var message = new Message\r\n" + "{\r\n" + "\tSubject = \"Did you see last night's game?\",\r\n" + "\tImportance = Importance.Low,\r\n" + "\tBody = new ItemBody\r\n" + "\t{\r\n" + "\t\tContentType = BodyType.Html,\r\n" + "\t\tContent = \"They were <b>awesome</b>!\"\r\n" + "\t},\r\n" + "\tToRecipients = new List<Recipient>()\r\n" + "\t{\r\n" + "\t\tnew Recipient\r\n" + "\t\t{\r\n" + "\t\t\tEmailAddress = new EmailAddress\r\n" + "\t\t\t{\r\n" + "\t\t\t\tAddress = \"[email protected]\"\r\n" + "\t\t\t}\r\n" + "\t\t},\r\n" + "\t\tnew Recipient\r\n" + "\t\t{\r\n" + "\t\t\tEmailAddress = new EmailAddress\r\n" + "\t\t\t{\r\n" + "\t\t\t\tAddress = \"[email protected]\"\r\n" + "\t\t\t}\r\n" + "\t\t}\r\n" + "\t}\r\n" + "};\r\n\r\n" + "await graphClient.Me.Messages\n" + "\t.Request()\n" + "\t.AddAsync(message);"; //Assert the snippet generated is as expected Assert.Equal(AuthProviderPrefix + expectedSnippet, result); }