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);
 }
Пример #3
0
        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);
 }