Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 38 additions & 2 deletions src/Intercom.Tests/Core/ClientTest.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,49 @@
using NUnit.Framework;
using System;
using System.IO;
using Intercom.Clients;
using Intercom.Core;
using Intercom.Exceptions;
using Intercom.Factories;
using Moq;
using NUnit.Framework;
using RestSharp;

namespace Intercom.Test
{
[TestFixture ()]
public class ClientTest
{
private static IRestRequest CaptureRequest(Action<ContactsClient> call)
{
IRestRequest captured = null;
var restClient = new Mock<IRestClient>();
restClient.Setup(_ => _.Execute(It.IsAny<IRestRequest>()))
.Callback<IRestRequest>(r => captured = r)
.Returns((IRestResponse)null);
var factory = new Mock<RestClientFactory>(new Authentication("DEFAULT", "DEFAULT"));
factory.Setup(_ => _.RestClient).Returns(restClient.Object);

try { call(new ContactsClient(factory.Object)); }
catch (IntercomException) { }

return captured;
}

[Test]
public void Test ()
public void EncodesIdWhenBuildingPath ()
{
var request = CaptureRequest(c => c.View("a/b?x=1#f"));

var uri = new RestClient("https://api.intercom.io/").BuildUri(request);
Assert.AreEqual("/contacts/a%2Fb%3Fx%3D1%23f", uri.AbsolutePath);
Assert.AreEqual(String.Empty, uri.Query);
}

[TestCase(".")]
[TestCase("..")]
public void RejectsDotSegmentId (string id)
{
Assert.Throws<ArgumentException>(() => CaptureRequest(c => c.View(id)));
}
}
}
2 changes: 1 addition & 1 deletion src/Intercom/Clients/AdminConversationsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public Conversation Reply(AdminConversationReply reply)

ClientResponse<Conversation> result = null;
String body = Serialize<AdminConversationReply>(reply);
result = Post<Conversation>(body, resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + reply.conversation_id + Path.DirectorySeparatorChar + REPLY_RESOURCE);
result = Post<Conversation>(body, resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(reply.conversation_id) + Path.DirectorySeparatorChar + REPLY_RESOURCE);
return result.Result;
}

Expand Down
4 changes: 2 additions & 2 deletions src/Intercom/Clients/AdminsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public Admin View (String id)
}

ClientResponse<Admin> result = null;
result = Get<Admin> (resource: ADMINS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Admin> (resource: ADMINS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -81,7 +81,7 @@ public Admin View(Admin admin)
}

ClientResponse<Admin> result = null;
result = Get<Admin> (resource: ADMINS_RESOURCE + Path.DirectorySeparatorChar + admin.id);
result = Get<Admin> (resource: ADMINS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(admin.id));
return result.Result;
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/Intercom/Clients/CompanyClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public Company View(String id)
throw new ArgumentNullException(nameof(id));
}
ClientResponse<Company> result = null;
result = Get<Company>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Company>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -94,7 +94,7 @@ public Company View(Company company)

if (!String.IsNullOrEmpty(company.id))
{
result = Get<Company>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + company.id);
result = Get<Company>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(company.id));
}
else if (!String.IsNullOrEmpty(company.name))
{
Expand Down Expand Up @@ -163,7 +163,7 @@ public Users ListUsers(Company company)

if (!String.IsNullOrEmpty(company.id))
{
String resource = company.id + Path.DirectorySeparatorChar + "users";
String resource = EncodePathSegment(company.id) + Path.DirectorySeparatorChar + "users";
result = Get<Users>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + resource);
}
else if (!String.IsNullOrEmpty(company.company_id))
Expand All @@ -187,7 +187,7 @@ public Users ListUsers(String companyId)
throw new ArgumentNullException(nameof(companyId));
}

String resource = companyId + Path.DirectorySeparatorChar + "users";
String resource = EncodePathSegment(companyId) + Path.DirectorySeparatorChar + "users";
ClientResponse<Users> result = null;
result = Get<Users>(resource: COMPANIES_RESOURCE + Path.DirectorySeparatorChar + resource);
return result.Result;
Expand Down
8 changes: 4 additions & 4 deletions src/Intercom/Clients/ContactsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public Contact View (String id)
}

ClientResponse<Contact> result = null;
result = Get<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -90,7 +90,7 @@ public Contact View (Contact contact)
ClientResponse<Contact> result = null;

if (!String.IsNullOrEmpty (contact.id)) {
result = Get<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + contact.id);
result = Get<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(contact.id));
} else if (!String.IsNullOrEmpty (contact.user_id)) {
parameters.Add (Constants.USER_ID, contact.user_id);
result = Get<Contact> (parameters: parameters);
Expand Down Expand Up @@ -162,7 +162,7 @@ public Contact Delete (Contact contact)
ClientResponse<Contact> result = null;

if (!String.IsNullOrEmpty (contact.id)) {
result = Delete<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + contact.id);
result = Delete<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(contact.id));
} else if (!String.IsNullOrEmpty (contact.user_id)) {
parameters.Add (Constants.USER_ID, contact.user_id);
result = Delete<Contact> (parameters: parameters);
Expand All @@ -180,7 +180,7 @@ public Contact Delete (String id)
}

ClientResponse<Contact> result = null;
result = Delete<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Delete<Contact> (resource: CONTACTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Intercom/Clients/ConversationsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public Conversation View(String id, bool? displayAsPlainText = null)
}

ClientResponse<Conversation> result = null;
result = Get<Conversation>(resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Conversation>(resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand Down
2 changes: 1 addition & 1 deletion src/Intercom/Clients/NotesClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public Note View(String id)
}

ClientResponse<Note> result = null;
result = Get<Note>(resource: NOTES_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Note>(resource: NOTES_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand Down
4 changes: 2 additions & 2 deletions src/Intercom/Clients/SegmentsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public Segment View(String id, bool? includeCount = null)
};

ClientResponse<Segment> result = null;
result = Get<Segment>(parameters: parameters, resource: SEGMENTS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Segment>(parameters: parameters, resource: SEGMENTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -104,7 +104,7 @@ public Segment View(Segment segment, bool? includeCount = null)
};

ClientResponse<Segment> result = null;
result = Get<Segment>(parameters: parameters, resource: SEGMENTS_RESOURCE + Path.DirectorySeparatorChar + segment.id);
result = Get<Segment>(parameters: parameters, resource: SEGMENTS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(segment.id));
return result.Result;
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/Intercom/Clients/TagsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public Tag View(String id)
}

ClientResponse<Tag> result = null;
result = Get<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -98,7 +98,7 @@ public Tag View(Tag tag)

if (!String.IsNullOrEmpty(tag.id))
{
result = Get<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + tag.id);
result = Get<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(tag.id));
}
else
{
Expand Down Expand Up @@ -144,7 +144,7 @@ public void Delete(Tag tag)
throw new ArgumentException("you need to provide 'tag.id' to delete a tag.");
}

Delete<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + tag.id);
Delete<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(tag.id));
}

public void Delete(String id)
Expand All @@ -154,7 +154,7 @@ public void Delete(String id)
throw new ArgumentNullException(nameof(id));
}

Delete<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + id);
Delete<Tag>(resource: TAGS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
}

public Tag Tag(String name, List<Company> companies)
Expand Down
2 changes: 1 addition & 1 deletion src/Intercom/Clients/UserConversationsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public Conversation Reply(UserConversationReply reply)

ClientResponse<Conversation> result = null;
String body = Serialize<UserConversationReply>(reply);
result = Post<Conversation>(body, resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + reply.conversation_id + Path.DirectorySeparatorChar + REPLY_RESOURCE);
result = Post<Conversation>(body, resource: CONVERSATIONS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(reply.conversation_id) + Path.DirectorySeparatorChar + REPLY_RESOURCE);
return result.Result;
}

Expand Down
8 changes: 4 additions & 4 deletions src/Intercom/Clients/UsersClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public User View(String id)
}

ClientResponse<User> result = null;
result = Get<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -145,7 +145,7 @@ public User View(User user)

if (!String.IsNullOrEmpty(user.id))
{
result = Get<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + user.id);
result = Get<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(user.id));
}
else if (!String.IsNullOrEmpty(user.user_id))
{
Expand Down Expand Up @@ -217,7 +217,7 @@ public User Archive(User user)

if (!String.IsNullOrEmpty(user.id))
{
result = Delete<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + user.id);
result = Delete<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(user.id));
}
else if (!String.IsNullOrEmpty(user.user_id))
{
Expand Down Expand Up @@ -251,7 +251,7 @@ public User Archive(String id)
}

ClientResponse<User> result = null;
result = Delete<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Delete<User>(resource: USERS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand Down
8 changes: 4 additions & 4 deletions src/Intercom/Clients/VisitorsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public Visitor View(String id)
}

ClientResponse<Visitor> result = null;
result = Get<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Get<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand All @@ -78,7 +78,7 @@ public Visitor View(Visitor visitor)

if (!String.IsNullOrEmpty(visitor.id))
{
result = Get<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + visitor.id);
result = Get<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(visitor.id));
}
else if (!String.IsNullOrEmpty(visitor.user_id))
{
Expand Down Expand Up @@ -124,7 +124,7 @@ public Visitor Delete(Visitor visitor)

Dictionary<String, String> parameters = new Dictionary<string, string>();
ClientResponse<Visitor> result = null;
result = Delete<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + visitor.id);
result = Delete<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(visitor.id));
return result.Result;
}

Expand All @@ -136,7 +136,7 @@ public Visitor Delete(String id)
}

ClientResponse<Visitor> result = null;
result = Delete<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + id);
result = Delete<Visitor>(resource: VISITORS_RESOURCE + Path.DirectorySeparatorChar + EncodePathSegment(id));
return result.Result;
}

Expand Down
8 changes: 8 additions & 0 deletions src/Intercom/Core/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,14 @@ protected virtual IRestRequest BuildRequest(Method httpMethod = Method.GET,
return request;
}

protected static String EncodePathSegment(String id)
{
if (String.IsNullOrEmpty(id) || id == "." || id == "..")
throw new ArgumentException("The id cannot be used as a path segment.", nameof(id));

return Uri.EscapeDataString(id);
}

protected virtual IRestClient BuildClient()
{
return _restClientFactory.RestClient;
Expand Down
Loading