public void AnnotationRequiredMaxMinLengthTimestamp() { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri.OriginalString + "$metadata", UriKind.Absolute), useDefaultCredentials: true, usePostTunneling: false, headers: new Dictionary<string, string>())); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var modelStr = r.ReadToEnd(); // [Required] ==> Nullable="false" Assert.Contains( "<Property Name=\"FirstName\" Type=\"Edm.String\" Nullable=\"false\" MaxLength=\"max\" />", modelStr, StringComparison.Ordinal); // [MaxLength] [MinLength] --> only MaxLength=".." Assert.Contains( "<Property Name=\"LastName\" Type=\"Edm.String\" MaxLength=\"26\" />", modelStr, StringComparison.Ordinal); // [Timestamp] ==> Computed Assert.Contains( "<Property Name=\"TimeStampValue\" Type=\"Edm.Binary\" Nullable=\"false\" MaxLength=\"8\">\r\n" + " <Annotation Term=\"Org.OData.Core.V1.Computed\" Bool=\"true\" />", modelStr, StringComparison.Ordinal); } }
public void AnnotationComputedOptimisticConcurrency() { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri.OriginalString + "$metadata", UriKind.Absolute), true, false, new Dictionary<string, string>())); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var modelStr = r.ReadToEnd(); Assert.Contains("<Annotation Term=\"Org.OData.Core.V1.Computed\" Bool=\"true\" />", modelStr, StringComparison.Ordinal); Assert.Contains("<Annotation Term=\"Org.OData.Core.V1.OptimisticConcurrency\">", modelStr, StringComparison.Ordinal); } }
public void MetadataShouldContainEnumProperty() { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri.OriginalString + "$metadata", UriKind.Absolute), true, false, new Dictionary<string, string>())); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var modelStr = r.ReadToEnd(); Assert.Contains("<EnumType Name=\"Feature\">", modelStr, StringComparison.Ordinal); Assert.Contains("<Member Name=\"Feature1\" Value=\"0\" />", modelStr, StringComparison.Ordinal); Assert.Contains("<Member Name=\"Feature2\" Value=\"1\" />", modelStr, StringComparison.Ordinal); Assert.Contains("<Member Name=\"Feature3\" Value=\"2\" />", modelStr, StringComparison.Ordinal); Assert.Contains("<Member Name=\"Feature4\" Value=\"3\" />", modelStr, StringComparison.Ordinal); Assert.Contains("<Property Name=\"FavoriteFeature\"", modelStr, StringComparison.Ordinal); } }
private void TestPayloadString(string uriAfterServiceRoot, Action<string> testMethod) { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri, uriAfterServiceRoot), true, false, new Dictionary<string, string>())); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var payloadStr = r.ReadToEnd(); testMethod(payloadStr); } }
private void TestGet(string relativeUri, string expectedPayload) { var headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }; var request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Get", new Uri(this.TestClientContext.BaseUri, relativeUri), false, false, headers)); using (var response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); using (var stream = response.GetStream()) { var reader = new StreamReader(stream); var content = reader.ReadToEnd(); Assert.Equal(expectedPayload, content); } } }
private void TestPut(string relativeUri, string payload) { var headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }; var request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Put", new Uri(this.TestClientContext.BaseUri, relativeUri), false, false, headers)); using (var stream = request.GetStream()) using (var writer = new StreamWriter(stream)) { writer.Write(payload); } using (var response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); } }
public void RequestNonExistingEntityShouldReturnNotFound() { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri.OriginalString + "Airlines('NonExisting')", UriKind.Absolute), useDefaultCredentials: true, usePostTunneling: false, headers: new Dictionary<string, string>())); DataServiceTransportException exception = null; try { requestMessage.GetResponse(); } catch (DataServiceTransportException e) { exception = e; } Assert.NotNull(exception); Assert.Equal(404, exception.Response.StatusCode); }
public void QueryWithFormat() { Dictionary<string, string> testCases = new Dictionary<string, string>() { {"People?$format=application/json", "application/json"}, // ODL Bug: https://github.com/OData/odata.net/issues/313 ////{"People?$format=application/json;odata.metadata=full", "application/json; odata.metadata=full"}, {"People?$format=json", "application/json"}, }; ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings() { BaseUri = ServiceBaseUri }; foreach (var testCase in testCases) { DataServiceClientRequestMessageArgs args = new DataServiceClientRequestMessageArgs( "GET", new Uri(ServiceBaseUri.AbsoluteUri + testCase.Key, UriKind.Absolute), false, false, new Dictionary<string, string>() { }); var requestMessage = new HttpWebRequestMessage(args); using (var responseMessage = requestMessage.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, responseMessage.StatusCode); string contentType = responseMessage.Headers.FirstOrDefault(x => x.Key.Equals("Content-Type")).Value; Assert.True(contentType.StartsWith(testCase.Value)); using (var messageReader = new ODataMessageReader( responseMessage, readerSettings, this.TestClientContext.Format.LoadServiceModel())) { var reader = messageReader.CreateODataFeedReader(); while (reader.Read()) { if (reader.State == ODataReaderState.EntryEnd) { ODataEntry entry = reader.Item as ODataEntry; Assert.NotNull(entry.Properties.Single(p => p.Name == "PersonId").Value); } else if (reader.State == ODataReaderState.FeedEnd) { Assert.NotNull(reader.Item as ODataFeed); } } Assert.Equal(ODataReaderState.Completed, reader.State); } } } }
public void CURDCollectionNavigationPropertyAndRef() { this.TestClientContext.MergeOption = MergeOption.OverwriteChanges; Person person = new Person() { FirstName = "Sheldon", LastName = "Cooper", UserName = "******" }; this.TestClientContext.AddToPeople(person); this.TestClientContext.SaveChanges(); int personId = person.PersonId; var startDate = DateTime.Now; Trip trip1 = new Trip() { PersonId = personId, TrackGuid = Guid.NewGuid(), ShareId = new Guid("c95d15e8-582b-44cf-9e97-ff63a5f26091"), Name = "Honeymoon", Budget = 2000.0f, Description = "Happy honeymoon trip", StartsAt = startDate, EndsAt = startDate.AddDays(3), LastUpdated = DateTime.UtcNow, }; Trip trip2 = new Trip() { PersonId = personId, TrackGuid = Guid.NewGuid(), ShareId = new Guid("56947cf5-2133-43b8-81f0-b6c3f1e5e51a"), Name = "Honeymoon", Budget = 3000.0f, Description = "Happy honeymoon trip", StartsAt = startDate.AddDays(1), EndsAt = startDate.AddDays(5), LastUpdated = DateTime.UtcNow, }; this.TestClientContext.AddToTrips(trip1); this.TestClientContext.SaveChanges(); // Create a related entity by Navigation link this.TestClientContext.AddRelatedObject(person, "Trips", trip2); this.TestClientContext.SaveChanges(); // Query Navigation properties. var trips = this.TestClientContext.People .ByKey(new Dictionary<string, object> { { "PersonId", personId } }) .Trips.ToList(); Assert.Equal(2, trips.Count()); Assert.True(trips.Any(t => t.TripId == trip1.TripId)); Assert.True(trips.Any(t => t.TripId == trip2.TripId)); // Get $ref HttpWebRequestMessage request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Get", new Uri(string.Format(this.TestClientContext.BaseUri + "/People({0})/Trips/$ref", personId), UriKind.Absolute), false, false, new Dictionary<string, string>())); using (var response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); using (var stream = response.GetStream()) { StreamReader reader = new StreamReader(stream); var expectedPayload = "{" + "\r\n" + @" ""@odata.context"":""http://*****:*****@" {" + "\r\n" + string.Format(@" ""@odata.id"":""http://*****:*****@" ""@odata.id"":""http://localhost:18384/api/Trippin/Trips({0})""", trip2.TripId) + "\r\n" + " }" + "\r\n" + " ]" + "\r\n" + "}"; var content = reader.ReadToEnd(); Assert.Equal(expectedPayload, content); } } // Delete $ref this.TestClientContext.DeleteLink(person, "Trips", trip2); this.TestClientContext.SaveChanges(); // Expand Navigation properties this.TestClientContext.Detach(trip1); person = this.TestClientContext.People .ByKey(new Dictionary<string, object> { { "PersonId", personId } }) .Expand(t => t.Trips) .GetValue(); Assert.Equal(1, person.Trips.Count); Assert.True(person.Trips.Any(t => t.TripId == trip1.TripId)); Person person2 = new Person() { FirstName = "Sheldon2", LastName = "Cooper2", UserName = "******" }; this.TestClientContext.AddToPeople(person2); this.TestClientContext.SaveChanges(); personId = person2.PersonId; // Add $ref this.TestClientContext.AddLink(person2, "Trips", trip2); this.TestClientContext.SaveChanges(); // Expand Navigation properties this.TestClientContext.Detach(trip1); this.TestClientContext.Detach(trip2); person = this.TestClientContext.People .ByKey(new Dictionary<string, object> { { "PersonId", personId } }) .Expand(t => t.Trips) .GetValue(); Assert.Equal(1, person.Trips.Count); Assert.True(person.Trips.Any(t => t.TripId == trip2.TripId)); }
public void CURDSingleNavigationPropertyAndRef() { this.TestClientContext.MergeOption = Microsoft.OData.Client.MergeOption.OverwriteChanges; Airline airline = new Airline() { Name = "American Delta", AirlineCode = "DL", TimeStampValue = new byte[] { 0 } }; this.TestClientContext.AddToAirlines(airline); this.TestClientContext.SaveChanges(); // Post an entity Flight flight = new Flight() { ConfirmationCode = "JH58496", FlightNumber = "DL589", StartsAt = new DateTimeOffset(new DateTime(2014, 2, 10, 15, 00, 0)), EndsAt = new DateTimeOffset(new DateTime(2014, 2, 10, 16, 30, 0)), AirlineId = null, SeatNumber = "C32", FromId = "KSEA", ToId = "ZSSS" }; this.TestClientContext.AddToFlights(flight); this.TestClientContext.SaveChanges(); // Set $ref this.TestClientContext.SetLink(flight, "Airline", airline); this.TestClientContext.SaveChanges(); this.TestClientContext.Detach(airline); // Query an Navigation Property var airline2 = this.TestClientContext.Flights .ByKey(new Dictionary<string, object>() { { "FlightId", flight.FlightId } }) .Airline.GetValue(); Assert.Equal(airline.AirlineCode, airline2.AirlineCode); // Expand an Navigation Property var flight2 = this.TestClientContext.Flights .Expand(f => f.From) .Expand(f => f.To) .Where(f => f.FlightId == flight.FlightId) .SingleOrDefault(); Assert.Equal(flight.FromId, flight2.From.IcaoCode); Assert.Equal(flight.ToId, flight2.To.IcaoCode); // Expand with select this.TestClientContext.Detach(flight2.From); var flight3 = this.TestClientContext.Flights .AddQueryOption("$expand", "From($select=IcaoCode)") .Where(f => f.FlightId == flight.FlightId) .SingleOrDefault(); Assert.Equal(flight.FromId, flight3.From.IcaoCode); Assert.Null(flight3.From.IataCode); // Get $ref Dictionary<string, string> headers = new Dictionary<string, string>(); ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings { BaseUri = this.TestClientContext.BaseUri }; HttpWebRequestMessage request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Get", new Uri(string.Format(this.TestClientContext.BaseUri + "/Flights({0})/Airline/$ref", flight.FlightId), UriKind.Absolute), false, false, headers)); using (HttpWebResponseMessage response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); using (var stream = response.GetStream()) { StreamReader reader = new StreamReader(stream); var expectedPayload = "{" + "\r\n" + @" ""@odata.context"":""http://*****:*****@"""@odata.id"":""http://localhost:18384/api/Trippin/Airlines('{0}')""", airline2.AirlineCode) + "\r\n" + "}"; var content = reader.ReadToEnd(); Assert.Equal(expectedPayload, content); } } // Delete $ref this.TestClientContext.SetLink(flight, "Airline", null); this.TestClientContext.SaveChanges(); this.TestClientContext.Detach(airline); HttpWebRequestMessage request2 = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Get", new Uri(string.Format(this.TestClientContext.BaseUri + "/Flights({0})/Airline/$ref", flight.FlightId) , UriKind.Absolute), false, false, headers)); DataServiceTransportException exception = null; try { request2.GetResponse(); } catch (DataServiceTransportException e) { exception = e; } Assert.NotNull(exception); Assert.Equal(404, exception.Response.StatusCode); // TODO GitHubIssue#48 : Add case for null entity return value // WebApi doesn't allow return a null entity. // Query an Navigation Property //airline2 = this.TestClientContext.Flights.ByKey(new Dictionary<string, object>() { { "FlightId", flight.FlightId } }).Airline.GetValue(); //Assert.Null(airline2); }
public void UQProperty() { this.TestClientContext.MergeOption = MergeOption.OverwriteChanges; // Post an entity Person person = new Person() { FirstName = "Sheldon", LastName = "Cooper", UserName = "******" }; this.TestClientContext.AddToPeople(person); this.TestClientContext.SaveChanges(); int personId = person.PersonId; // Query a property var lastName = this.TestClientContext.People .Where(p => p.PersonId == personId).Select(p => p.LastName) .SingleOrDefault(); Assert.Equal("Cooper", lastName); // Update a property Dictionary<string, string> headers = new Dictionary<string, string>() { { "Content-Type", "application/json" } }; HttpWebRequestMessage request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Put", new Uri(string.Format(this.TestClientContext.BaseUri + "/People({0})/LastName", personId), UriKind.Absolute), false, false, headers)); using (var stream = request.GetStream()) using (StreamWriter writer = new StreamWriter(stream)) { var Payload = @"{""value"":""Lee""}"; writer.Write(Payload); } using (var response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); } // Query a property's value : ~/$value headers.Clear(); ODataMessageReaderSettings readerSettings = new ODataMessageReaderSettings { BaseUri = this.TestClientContext.BaseUri }; request = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "Get", new Uri(string.Format(this.TestClientContext.BaseUri + "/People({0})/LastName/$value", personId), UriKind.Absolute), false, false, headers)); using (var response = request.GetResponse() as HttpWebResponseMessage) { Assert.Equal(200, response.StatusCode); using (var stream = response.GetStream()) { StreamReader reader = new StreamReader(stream); var expectedPayload = "Lee"; var content = reader.ReadToEnd(); Assert.Equal(expectedPayload, content); } } }
public void MetadataShouldContainDerivedType() { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "GET", new Uri(this.ServiceBaseUri.OriginalString + "$metadata", UriKind.Absolute), true, false, new Dictionary<string, string>())); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var modelStr = r.ReadToEnd(); Assert.Contains("<EntityType Name=\"Manager\" BaseType=\"Microsoft.OData.Service.Sample.Trippin.Models.Person\">", modelStr, StringComparison.Ordinal); Assert.Contains("<EntityType Name=\"Employee\" BaseType=\"Microsoft.OData.Service.Sample.Trippin.Models.Person\">", modelStr, StringComparison.Ordinal); } }
private void TestPostStatusCodeIs(string uriStringAfterServiceRoot, int statusCode) { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "POST", new Uri(this.ServiceBaseUri.OriginalString + uriStringAfterServiceRoot, UriKind.Absolute), useDefaultCredentials: true, usePostTunneling: false, headers: new Dictionary<string, string>() { { "Content-Length", "0" } })); Assert.Equal(statusCode, requestMessage.GetResponse().StatusCode); }
private void TestPostPayloadContains(string uriStringAfterServiceRoot, string expectedSubString) { var requestMessage = new HttpWebRequestMessage( new DataServiceClientRequestMessageArgs( "POST", new Uri(this.ServiceBaseUri.OriginalString + uriStringAfterServiceRoot, UriKind.Absolute), useDefaultCredentials: true, usePostTunneling: false, headers: new Dictionary<string, string>() { { "Content-Length", "0" } })); using (var r = new StreamReader(requestMessage.GetResponse().GetStream())) { var payloadString = r.ReadToEnd(); Assert.Contains(expectedSubString, payloadString); } }