public async Task <IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "range/{hashPrefix}")] HttpRequest req, string hashPrefix, CancellationToken cancellationToken = default) { if (!hashPrefix.IsHexStringOfLength(5)) { return(req.BadRequest("The hash format was not in a valid format")); } try { PwnedPasswordsFile entry = await _fileStorage.GetHashFileAsync(hashPrefix.ToUpper(), cancellationToken); return(new FileStreamResult(entry.Content, "text/plain") { LastModified = entry.LastModified }); } catch (FileNotFoundException) { return(req.NotFound()); } catch (Exception ex) { _log.LogError(ex, "Something went wrong."); return(req.InternalServerError()); } }
public async Task Returns_ok_given_valid_hashprefix() { string validHashPrefix = "ABCDE"; var returnHashFile = new PwnedPasswordsFile(Stream.Null, DateTimeOffset.UtcNow, "*"); var mockStorage = new Mock <IFileStorage>(); mockStorage.Setup(s => s.GetHashFileAsync(validHashPrefix, CancellationToken.None)).ReturnsAsync(returnHashFile); var function = new Functions.Range(s_nullLogger, mockStorage.Object); var context = new DefaultHttpContext(); IActionResult?actualResponse = await function.RunAsync(context.Request, validHashPrefix); Assert.IsType <FileStreamResult>(actualResponse); }