|
7 | 7 |
|
8 | 8 | using System;
|
9 | 9 | using System.Collections.Generic;
|
| 10 | +using System.IO; |
10 | 11 | using System.Linq;
|
| 12 | +using System.Reflection.Metadata; |
| 13 | +using System.Runtime.CompilerServices; |
11 | 14 | using System.Runtime.Serialization;
|
12 | 15 | using System.Threading.Tasks;
|
13 | 16 | using Microsoft.AspNetCore.OData.Abstracts;
|
|
20 | 23 | using Microsoft.AspNetCore.OData.Tests.Edm;
|
21 | 24 | using Microsoft.AspNetCore.OData.Tests.Extensions;
|
22 | 25 | using Microsoft.AspNetCore.OData.Tests.Models;
|
| 26 | +using Microsoft.AspNetCore.Rewrite; |
23 | 27 | using Microsoft.Extensions.DependencyInjection;
|
24 | 28 | using Microsoft.Net.Http.Headers;
|
25 | 29 | using Microsoft.OData;
|
@@ -2249,6 +2253,78 @@ public async Task WriteObjectInlineAsync_SetsParentContext_ForExpandedNavigation
|
2249 | 2253 | It.Is<ODataSerializerContext>(c => c.ExpandedResource.SerializerContext == _writeContext)));
|
2250 | 2254 | }
|
2251 | 2255 |
|
| 2256 | + [Fact] |
| 2257 | + public async Task WriteObjectInlineAsync_Writes_Nested_Entities_Without_NavigationSource() |
| 2258 | + { |
| 2259 | + // Arrange |
| 2260 | + ODataModelBuilder builder = new ODataConventionModelBuilder(); |
| 2261 | + builder.Namespace = "Default"; |
| 2262 | + builder.EntityType<Product>(); |
| 2263 | + builder.ComplexType<Result>(); |
| 2264 | + var model = builder.GetEdmModel(); |
| 2265 | + |
| 2266 | + var result = new Result |
| 2267 | + { |
| 2268 | + Title = "myResult", |
| 2269 | + Products = new Product[] |
| 2270 | + { |
| 2271 | + new Product |
| 2272 | + { |
| 2273 | + ProductID = 1 |
| 2274 | + }, |
| 2275 | + new Product |
| 2276 | + { |
| 2277 | + ProductID = 2 |
| 2278 | + } |
| 2279 | + } |
| 2280 | + }; |
| 2281 | + |
| 2282 | + var resultType = model.FindType("Default.Result") as IEdmComplexType; |
| 2283 | + var resultTypeReference = new EdmComplexTypeReference(resultType as IEdmComplexType, false); |
| 2284 | + var titleProperty = resultTypeReference.FindProperty("Title") as IEdmStructuralProperty; |
| 2285 | + var productsProperty = resultTypeReference.FindNavigationProperty("Products"); |
| 2286 | + var selectExpand = new SelectExpandClause(new SelectItem[] |
| 2287 | + { |
| 2288 | + new PathSelectItem(new ODataSelectPath(new PropertySegment(titleProperty))), |
| 2289 | + new ExpandedNavigationSelectItem(new ODataExpandPath(new NavigationPropertySegment(productsProperty, null)),null,null) |
| 2290 | + }, |
| 2291 | + false); |
| 2292 | + |
| 2293 | + var writeContext = new ODataSerializerContext() |
| 2294 | + { |
| 2295 | + Model = model, |
| 2296 | + SelectExpandClause = selectExpand |
| 2297 | + }; |
| 2298 | + |
| 2299 | + using (var stream = new MemoryStream()) |
| 2300 | + { |
| 2301 | + IODataResponseMessage responseMessage = new ODataMessageWrapper(stream); |
| 2302 | + ODataUri uri = new ODataUri { ServiceRoot = new Uri("http://myService", UriKind.Absolute) }; |
| 2303 | + ODataMessageWriterSettings settings = new ODataMessageWriterSettings |
| 2304 | + { |
| 2305 | + ODataUri = uri |
| 2306 | + }; |
| 2307 | + |
| 2308 | + using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings)) |
| 2309 | + { |
| 2310 | + ODataWriter writer = await messageWriter.CreateODataResourceWriterAsync(null, resultType as IEdmComplexType); |
| 2311 | + ODataResourceSerializer serializer = new ODataResourceSerializer(_serializerProvider); |
| 2312 | + |
| 2313 | + // Act |
| 2314 | + await serializer.WriteObjectInlineAsync(result, resultTypeReference, writer, writeContext); |
| 2315 | + |
| 2316 | + // Assert |
| 2317 | + stream.Position = 0; |
| 2318 | + using (StreamReader reader = new StreamReader(stream)) |
| 2319 | + { |
| 2320 | + string response = reader.ReadToEnd(); |
| 2321 | + Assert.Contains(@"""ProductID"":1", response); |
| 2322 | + Assert.Contains(@"""ProductID"":2", response); |
| 2323 | + } |
| 2324 | + } |
| 2325 | + } |
| 2326 | + } |
| 2327 | + |
2252 | 2328 | [Fact]
|
2253 | 2329 | public void CreateSelectExpandNode_Caches_SelectExpandNode()
|
2254 | 2330 | {
|
@@ -2487,6 +2563,12 @@ private class Order
|
2487 | 2563 | public Customer Customer { get; set; }
|
2488 | 2564 | }
|
2489 | 2565 |
|
| 2566 | + private class Result |
| 2567 | + { |
| 2568 | + public string Title { get; set; } |
| 2569 | + public IList<Product> Products { get; set; } |
| 2570 | + } |
| 2571 | + |
2490 | 2572 | private class SpecialOrder
|
2491 | 2573 | {
|
2492 | 2574 | public SpecialCustomer SpecialCustomer { get; set; }
|
|
0 commit comments