|  | 
|  | 1 | +using System; | 
| 1 | 2 | using System.Collections.Generic; | 
| 2 | 3 | using System.Reflection; | 
|  | 4 | +using System.Threading.Tasks; | 
| 3 | 5 | 
 | 
| 4 | 6 | using FluentAssertions; | 
| 5 | 7 | 
 | 
| 6 | 8 | using Microsoft.AspNetCore.Http; | 
|  | 9 | +using Microsoft.AspNetCore.Http.Internal; | 
| 7 | 10 | using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions; | 
|  | 11 | +using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums; | 
|  | 12 | +using Microsoft.Extensions.Primitives; | 
| 8 | 13 | using Microsoft.OpenApi.Models; | 
| 9 | 14 | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
| 10 | 15 | 
 | 
| @@ -137,5 +142,140 @@ public void Given_NullOptions_When_AddServer_Invoked_Then_It_Should_Return_Swagg | 
| 137 | 142 | 
 | 
| 138 | 143 |             (fi.GetValue(ui) as string).Should().Be(expected); | 
| 139 | 144 |         } | 
|  | 145 | + | 
|  | 146 | + | 
|  | 147 | +        [DataTestMethod] | 
|  | 148 | +        [DataRow(OpenApiAuthLevelType.Anonymous, null, false, false)] | 
|  | 149 | +        [DataRow(OpenApiAuthLevelType.Anonymous, "", false, false)] | 
|  | 150 | +        [DataRow(OpenApiAuthLevelType.Anonymous, "configKey", false, false)] | 
|  | 151 | +        [DataRow(OpenApiAuthLevelType.User, null, true, false)] | 
|  | 152 | +        [DataRow(OpenApiAuthLevelType.User, "", true, false)] | 
|  | 153 | +        [DataRow(OpenApiAuthLevelType.User, "configKey", false, true)] | 
|  | 154 | +        [DataRow(OpenApiAuthLevelType.Function, null, true, false)] | 
|  | 155 | +        [DataRow(OpenApiAuthLevelType.Function, "", true, false)] | 
|  | 156 | +        [DataRow(OpenApiAuthLevelType.Function, "configKey", false, true)] | 
|  | 157 | +        [DataRow(OpenApiAuthLevelType.System, null, true, false)] | 
|  | 158 | +        [DataRow(OpenApiAuthLevelType.System, "", true, false)] | 
|  | 159 | +        [DataRow(OpenApiAuthLevelType.System, "configKey", false, true)] | 
|  | 160 | +        [DataRow(OpenApiAuthLevelType.Admin, null, true, false)] | 
|  | 161 | +        [DataRow(OpenApiAuthLevelType.Admin, "", true, false)] | 
|  | 162 | +        [DataRow(OpenApiAuthLevelType.Admin, "configKey", false, true)] | 
|  | 163 | +        public void Given_Options_When_IsAuthKeyRequired_Invoked_Then_It_Should_Return_Result( | 
|  | 164 | +            OpenApiAuthLevelType configuredAuthLevel, string configKey, bool throwsException, bool expected) | 
|  | 165 | +        { | 
|  | 166 | +            var ui = new SwaggerUI(); | 
|  | 167 | +            var method = ui.GetType() | 
|  | 168 | +                .GetMethod("IsAuthKeyRequired", BindingFlags.Instance | BindingFlags.NonPublic); | 
|  | 169 | + | 
|  | 170 | +            Func<bool> action = () => (bool)method.Invoke(ui, new object[] { configuredAuthLevel, configKey }); | 
|  | 171 | + | 
|  | 172 | +            if (throwsException) | 
|  | 173 | +            { | 
|  | 174 | +                action.Should().Throw<TargetInvocationException>().And.InnerException.Should() | 
|  | 175 | +                    .BeOfType<InvalidOperationException>(); | 
|  | 176 | +            } | 
|  | 177 | +            else | 
|  | 178 | +            { | 
|  | 179 | +                action.Invoke().Should().Be(expected); | 
|  | 180 | +            } | 
|  | 181 | +        } | 
|  | 182 | + | 
|  | 183 | + | 
|  | 184 | +        [DataTestMethod] | 
|  | 185 | +        [DataRow(null, OpenApiAuthLevelType.Anonymous, null, null)] | 
|  | 186 | +        [DataRow(null, OpenApiAuthLevelType.Anonymous, "configKey", null)] | 
|  | 187 | +        [DataRow(null, OpenApiAuthLevelType.Anonymous, "", null)] | 
|  | 188 | +        [DataRow("queryKey", OpenApiAuthLevelType.Anonymous, "configKey", "queryKey")] | 
|  | 189 | +        [DataRow("queryKey", OpenApiAuthLevelType.Anonymous, null, "queryKey")] | 
|  | 190 | +        [DataRow("queryKey", OpenApiAuthLevelType.Anonymous, "", "queryKey")] | 
|  | 191 | +        [DataRow("", OpenApiAuthLevelType.Anonymous, null, "")] | 
|  | 192 | +        [DataRow("", OpenApiAuthLevelType.Anonymous, "configKey", "")] | 
|  | 193 | +        [DataRow("", OpenApiAuthLevelType.Anonymous, "", "")] | 
|  | 194 | +        [DataRow(null, OpenApiAuthLevelType.User, null, null, true)] | 
|  | 195 | +        [DataRow(null, OpenApiAuthLevelType.User, null, "", true)] | 
|  | 196 | +        [DataRow(null, OpenApiAuthLevelType.User, "configKey", "configKey")] | 
|  | 197 | +        [DataRow("queryKey", OpenApiAuthLevelType.User, "configKey", "configKey")] | 
|  | 198 | +        [DataRow("queryKey", OpenApiAuthLevelType.User, null, "queryKey")] | 
|  | 199 | +        [DataRow("queryKey", OpenApiAuthLevelType.User, "", "queryKey")] | 
|  | 200 | +        [DataRow("", OpenApiAuthLevelType.User, "configKey", "configKey")] | 
|  | 201 | +        [DataRow("", OpenApiAuthLevelType.User, null, "",true)] | 
|  | 202 | +        [DataRow("", OpenApiAuthLevelType.User, "", "",true)] | 
|  | 203 | +        [DataRow(null, OpenApiAuthLevelType.Function, null, null, true)] | 
|  | 204 | +        [DataRow(null, OpenApiAuthLevelType.Function, null, "", true)] | 
|  | 205 | +        [DataRow(null, OpenApiAuthLevelType.Function, "configKey", "configKey")] | 
|  | 206 | +        [DataRow("queryKey", OpenApiAuthLevelType.Function, "configKey", "configKey")] | 
|  | 207 | +        [DataRow("queryKey", OpenApiAuthLevelType.Function, null, "queryKey")] | 
|  | 208 | +        [DataRow("queryKey", OpenApiAuthLevelType.Function, "", "queryKey")] | 
|  | 209 | +        [DataRow("", OpenApiAuthLevelType.Function, "configKey", "configKey")] | 
|  | 210 | +        [DataRow("", OpenApiAuthLevelType.Function, null, "",true)] | 
|  | 211 | +        [DataRow("", OpenApiAuthLevelType.Function, "", "",true)] | 
|  | 212 | +        [DataRow(null, OpenApiAuthLevelType.System, null, null, true)] | 
|  | 213 | +        [DataRow(null, OpenApiAuthLevelType.System, null, "", true)] | 
|  | 214 | +        [DataRow(null, OpenApiAuthLevelType.System, "configKey", "configKey")] | 
|  | 215 | +        [DataRow("queryKey", OpenApiAuthLevelType.System, "configKey", "configKey")] | 
|  | 216 | +        [DataRow("queryKey", OpenApiAuthLevelType.System, null, "queryKey")] | 
|  | 217 | +        [DataRow("queryKey", OpenApiAuthLevelType.System, "", "queryKey")] | 
|  | 218 | +        [DataRow("", OpenApiAuthLevelType.System, "configKey", "configKey")] | 
|  | 219 | +        [DataRow("", OpenApiAuthLevelType.System, null, "",true)] | 
|  | 220 | +        [DataRow("", OpenApiAuthLevelType.System, "", "",true)] | 
|  | 221 | +        [DataRow(null, OpenApiAuthLevelType.Admin, null, null, true)] | 
|  | 222 | +        [DataRow(null, OpenApiAuthLevelType.Admin, null, "", true)] | 
|  | 223 | +        [DataRow(null, OpenApiAuthLevelType.Admin, "configKey", "configKey")] | 
|  | 224 | +        [DataRow("queryKey", OpenApiAuthLevelType.Admin, "configKey", "configKey")] | 
|  | 225 | +        [DataRow("queryKey", OpenApiAuthLevelType.Admin, null, "queryKey")] | 
|  | 226 | +        [DataRow("queryKey", OpenApiAuthLevelType.Admin, "", "queryKey")] | 
|  | 227 | +        [DataRow("", OpenApiAuthLevelType.Admin, "configKey", "configKey")] | 
|  | 228 | +        [DataRow("", OpenApiAuthLevelType.Admin, null, "",true)] | 
|  | 229 | +        [DataRow("", OpenApiAuthLevelType.Admin, "", "",true)] | 
|  | 230 | +        public async Task Given_AuthKey_Options_When_RenderAsync_Invoked_Then_It_Should_Be_Used_As_Request_Key( | 
|  | 231 | +            string queryKey, OpenApiAuthLevelType configuredAuthLevel, string configKey, string expectedRequestKey, | 
|  | 232 | +            bool throwsException = false) | 
|  | 233 | +        { | 
|  | 234 | +            var endpoint = "swagger/ui"; | 
|  | 235 | +            var baseUrl = "https://localhost:7071"; | 
|  | 236 | +            var ui = new SwaggerUI(); | 
|  | 237 | +            ui.AddMetadata(new OpenApiInfo()); | 
|  | 238 | +            var uiType = ui.GetType(); | 
|  | 239 | + | 
|  | 240 | +            //Generate Request Object with query key | 
|  | 241 | +            var queryDict = new Dictionary<string, StringValues>(); | 
|  | 242 | +            if (queryKey != null) | 
|  | 243 | +            { | 
|  | 244 | +                queryDict["code"] = queryKey; | 
|  | 245 | +            } | 
|  | 246 | +            var req = new Mock<IHttpRequestDataObject>(); | 
|  | 247 | +            req.SetupGet(p => p.Query).Returns(new QueryCollection(queryDict)); | 
|  | 248 | +            uiType.GetField("_req", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ui, req.Object); | 
|  | 249 | + | 
|  | 250 | +            //Set BaseUrl | 
|  | 251 | +            uiType.GetField("_baseUrl", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ui, baseUrl); | 
|  | 252 | + | 
|  | 253 | +            //Set html string just to contain url placeholder | 
|  | 254 | +            var swaggerUrlPlaceholder = | 
|  | 255 | +                uiType.GetField("SwaggerUrlPlaceholder", BindingFlags.Static | BindingFlags.NonPublic) | 
|  | 256 | +                    .GetRawConstantValue() as string; | 
|  | 257 | +            uiType.GetField("_indexHtml", BindingFlags.Instance | BindingFlags.NonPublic) | 
|  | 258 | +                .SetValue(ui, swaggerUrlPlaceholder); | 
|  | 259 | + | 
|  | 260 | + | 
|  | 261 | +            Func<Task<string>> action = async () => await ui.RenderAsync(endpoint, configuredAuthLevel, configKey); | 
|  | 262 | + | 
|  | 263 | +            if (throwsException) | 
|  | 264 | +            { | 
|  | 265 | +                await action.Should().ThrowAsync<InvalidOperationException>(); | 
|  | 266 | +            } | 
|  | 267 | +            else | 
|  | 268 | +            { | 
|  | 269 | +                var result = await action(); | 
|  | 270 | +                if (expectedRequestKey != null) | 
|  | 271 | +                { | 
|  | 272 | +                    result.Should().Contain($"code={expectedRequestKey}"); | 
|  | 273 | +                } | 
|  | 274 | +                else | 
|  | 275 | +                { | 
|  | 276 | +                    result.Should().NotContain($"code="); | 
|  | 277 | +                } | 
|  | 278 | +            } | 
|  | 279 | +        } | 
| 140 | 280 |     } | 
| 141 | 281 | } | 
0 commit comments