public void GetSampleRequests_Empty() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "Values", "Get"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleRequests(apiDescription); Assert.Empty(samples); }
public void Constructor() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); Assert.NotNull(sampleGenerator.SampleObjects); Assert.NotNull(sampleGenerator.ActionSamples); Assert.NotNull(sampleGenerator.ActualHttpMessageTypes); }
private static object GeneratePageResult(HelpPageSampleGenerator sampleGenerator, Type type) { if (type.IsGenericType) { Type openGenericType = type.GetGenericTypeDefinition(); if (openGenericType == typeof(PageResult<>)) { // Get the T in PageResult<T> Type[] typeParameters = type.GetGenericArguments(); Debug.Assert(typeParameters.Length == 1); // Create an enumeration to pass as the first parameter to the PageResult<T> constuctor Type itemsType = typeof(List<>).MakeGenericType(typeParameters); object items = sampleGenerator.GetSampleObject(itemsType); // Fill in the other information needed to invoke the PageResult<T> constuctor Type[] parameterTypes = new Type[] { itemsType, typeof(Uri), typeof(long?), }; object[] parameters = new object[] { items, null, (long)ObjectGenerator.DefaultCollectionSize, }; // Call PageResult(IEnumerable<T> items, Uri nextPageLink, long? count) constructor ConstructorInfo constructor = type.GetConstructor(parameterTypes); return constructor.Invoke(parameters); } } return null; }
public void GetSampleRequests_FromSampleObjects() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); sampleGenerator.SampleObjects.Add(typeof(string), "sample value"); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "Values", "Post", "value"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleRequests(apiDescription); Assert.NotEmpty(samples); foreach (var samplePair in samples) { Assert.Contains("sample value", ((TextSample)samplePair.Value).Text); } }
public void GetSampleRequests_FromSampleObjects_AndSettingActualRequestTypes() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); sampleGenerator.ActualHttpMessageTypes.Add(new HelpPageSampleKey(SampleDirection.Request, "values", "options", new[] { "request" }), typeof(string)); sampleGenerator.SampleObjects.Add(typeof(string), "sample value"); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "values", "options", "request"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleRequests(apiDescription); Assert.NotEmpty(samples); foreach (var samplePair in samples) { Assert.Contains("sample value", ((TextSample)samplePair.Value).Text); } }
public void GetSampleRequests_FromActionSamples_BasedOnMediaTypeAndType() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); var sample = new TextSample("test"); sampleGenerator.ActionSamples.Add(new HelpPageSampleKey(new MediaTypeHeaderValue("application/json"), typeof(Tuple<int, string>)), sample); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "Values", "Patch", "valuePair"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleRequests(apiDescription); Assert.NotEmpty(samples); object result; samples.TryGetValue(new MediaTypeHeaderValue("application/json"), out result); Assert.Same(sample, result); samples.TryGetValue(new MediaTypeHeaderValue("application/xml"), out result); Assert.NotSame(sample, result); }
public void ResolveType_ThrowsInvalidEnumArgumentException() { Assert.Throws(typeof(InvalidEnumArgumentException), () => { Collection<MediaTypeFormatter> formatters; HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); sampleGenerator.ResolveType(new ApiDescription(), "c", "a", new[] { "p" }, (SampleDirection)78, out formatters); }); }
public void WriteSampleObjectUsingFormatter_UnwrapsAggregateException() { Mock<MediaTypeFormatter> bogusFormatter = new Mock<MediaTypeFormatter>(); bogusFormatter.Setup(f => f.CanWriteType(It.IsAny<Type>())).Returns(true); bogusFormatter.Setup(f => f.WriteToStreamAsync(It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<Stream>(), It.IsAny<HttpContent>(), It.IsAny<TransportContext>())).Returns(() => { throw new AggregateException(new FormatException("Invalid format.")); }); HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); InvalidSample sampleNotProvided = Assert.IsType<InvalidSample>( sampleGenerator.WriteSampleObjectUsingFormatter( bogusFormatter.Object, "hello world", typeof(string), new MediaTypeHeaderValue("text/json") )); Assert.Equal("An exception has occurred while using the formatter 'MediaTypeFormatterProxy' to generate sample for media type 'text/json'. Exception message: Invalid format.", sampleNotProvided.ErrorMessage); }
private static HelpPageApiModel GenerateApiModel(ApiDescription apiDescription, HelpPageSampleGenerator sampleGenerator) { HelpPageApiModel apiModel = new HelpPageApiModel(); apiModel.ApiDescription = apiDescription; try { foreach (var item in sampleGenerator.GetSampleRequests(apiDescription)) { apiModel.SampleRequests.Add(item.Key, item.Value); LogInvalidSampleAsError(apiModel, item.Value); } foreach (var item in sampleGenerator.GetSampleResponses(apiDescription)) { apiModel.SampleResponses.Add(item.Key, item.Value); LogInvalidSampleAsError(apiModel, item.Value); } } catch (Exception e) { apiModel.ErrorMessages.Add(String.Format(CultureInfo.CurrentCulture, "An exception has occurred while generating the sample. Exception Message: {0}", e.Message)); } return apiModel; }
public void GetActionSample_ReturnNullWhenSampleNotProvided() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); Assert.Null( sampleGenerator.GetActionSample( "a", "b", new string[0], typeof(string), new XmlMediaTypeFormatter(), new MediaTypeHeaderValue("text/xml"), SampleDirection.Response )); }
public void GetSampleResponses_FromActionSamples_WhenTheReturnTypeIsHttpResponseMessage() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); var sample = new TextSample("test"); sampleGenerator.ActionSamples.Add(new HelpPageSampleKey(new MediaTypeHeaderValue("plain/text"), SampleDirection.Response, "Values", "Post", new[] { "value" }), sample); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "Values", "Post", "value"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleResponses(apiDescription); Assert.NotEmpty(samples); object result; samples.TryGetValue(new MediaTypeHeaderValue("plain/text"), out result); Assert.Same(sample, result); samples.TryGetValue(new MediaTypeHeaderValue("application/json"), out result); Assert.Null(result); }
private static void GenerateSamples(HelpPageApiModel apiModel, HelpPageSampleGenerator sampleGenerator) { try { foreach (var item in sampleGenerator.GetSampleRequests(apiModel.ApiDescription)) { apiModel.SampleRequests.Add(item.Key, item.Value); LogInvalidSampleAsError(apiModel, item.Value); } foreach (var item in sampleGenerator.GetSampleResponses(apiModel.ApiDescription)) { apiModel.SampleResponses.Add(item.Key, item.Value); LogInvalidSampleAsError(apiModel, item.Value); } } catch (Exception e) { apiModel.ErrorMessages.Add(String.Format(CultureInfo.CurrentCulture, "An exception has occurred while generating the sample. Exception message: {0}", HelpPageSampleGenerator.UnwrapException(e).Message)); } }
private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator) { ApiDescription apiDescription = apiModel.ApiDescription; foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) { if (apiParameter.Source == ApiParameterSource.FromBody) { Type parameterType = apiParameter.ParameterDescriptor.ParameterType; apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); apiModel.RequestDocumentation = apiParameter.Documentation; } else if (apiParameter.ParameterDescriptor != null && apiParameter.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage)) { Type parameterType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription); if (parameterType != null) { apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType); } } } }
/// <summary> /// Sets the help page sample generator. /// </summary> /// <param name="config">The <see cref="HttpConfiguration"/>.</param> /// <param name="sampleGenerator">The help page sample generator.</param> public static void SetHelpPageSampleGenerator(this HttpConfiguration config, HelpPageSampleGenerator sampleGenerator) { config.Properties.AddOrUpdate( typeof(HelpPageSampleGenerator), k => sampleGenerator, (k, o) => sampleGenerator); }
public void GetSampleRequests_FromActionSamples_BasedOnMediaTypeAndNames() { HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); var sample = new TextSample("test"); sampleGenerator.ActionSamples.Add(new HelpPageSampleKey(new MediaTypeHeaderValue("application/xml"), SampleDirection.Request, "Values", "Put", new[] { "valuePairCollection" }), sample); ApiDescription apiDescription = ApiDescriptionHelpers.GetApiDescription(null, "Values", "Put", "valuePairCollection"); IDictionary<MediaTypeHeaderValue, object> samples = sampleGenerator.GetSampleRequests(apiDescription); Assert.NotEmpty(samples); object result; samples.TryGetValue(new MediaTypeHeaderValue("application/xml"), out result); Assert.Same(sample, result); samples.TryGetValue(new MediaTypeHeaderValue("application/json"), out result); Assert.NotSame(sample, result); }
// Default factory for sample objects private static object DefaultSampleObjectFactory(HelpPageSampleGenerator sampleGenerator, Type type) { // Try to create a default sample object ObjectGenerator objectGenerator = new ObjectGenerator(); return objectGenerator.GenerateObject(type); }
public void WriteSampleObjectUsingFormatter_TryFormattingNonJsonSamples_DoesNotThrow() { Mock<MediaTypeFormatter> customFormatter = new Mock<MediaTypeFormatter>(); customFormatter.Setup(f => f.CanWriteType(It.IsAny<Type>())).Returns(true); customFormatter.Setup(f => f.WriteToStreamAsync(It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<Stream>(), It.IsAny<HttpContent>(), It.IsAny<TransportContext>())).Returns( (Type type, object obj, Stream stream, HttpContent content, TransportContext context) => { StreamWriter writer = new StreamWriter(stream); writer.Write("some\r\nnon <json> string"); writer.Flush(); TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(); tcs.SetResult(null); return tcs.Task; }); HelpPageSampleGenerator sampleGenerator = new HelpPageSampleGenerator(); TextSample sample = Assert.IsType<TextSample>( sampleGenerator.WriteSampleObjectUsingFormatter( customFormatter.Object, "hello world", typeof(string), new MediaTypeHeaderValue("text/json") )); Assert.Equal("some\r\nnon <json> string", sample.Text); }