Skip to content

Instantly share code, notes, and snippets.

@AbrantesMar
Created July 13, 2021 21:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AbrantesMar/041df371255f78898ea970537f0c5179 to your computer and use it in GitHub Desktop.
Save AbrantesMar/041df371255f78898ea970537f0c5179 to your computer and use it in GitHub Desktop.
public abstract class Results<T, TBuilder> where T : class
where TBuilder : Results<T, TBuilder>
{
public HttpStatusCode StatusCode;
public IEnumerable<T> ResultList;
public T Result;
protected abstract TBuilder BuilderInstance { get; }
protected Context context { get; private set; }
protected long testName = DateTime.Now.Ticks;
protected readonly string url;
protected Results(string url)
{
this.url = url;
}
public TBuilder WithContext(Context context)
{
this.context = context;
return (TBuilder)this;
}
public TBuilder Post(TestContext testContext, string api = null)
{
var urlParams = UrlWithParams(api);
var response = testContext.Post(urlParams, Result).Result;
StatusCode = response.StatusCode;
if (HttpStatusCode.OK.Equals(StatusCode) || HttpStatusCode.Created.Equals(StatusCode))
{
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsAsync<T>().Result;
if (result != null)
{
Result = result;
}
}
return (TBuilder)this;
}
public TBuilder Get(TestContext testContext, int id, string api = null)
{
Get(testContext, id.ToString(), api);
return (TBuilder)this;
}
public TBuilder Get(TestContext testContext, string param, string api = null)
{
var urlParams = UrlWithParams(api);
var response = testContext.Get($"{urlParams}/{param}").Result;
StatusCode = response.StatusCode;
if (HttpStatusCode.OK.Equals(StatusCode))
{
response.EnsureSuccessStatusCode();
var result = response.Content.ReadAsAsync<T>().Result;
if(result != null)
{
Result = result;
}
}
return (TBuilder)this;
}
public TBuilder GetPagination(TestContext testContext, int? page, int? limit, string api = null)
{
var urlParams = UrlWithParams(api);
new StringBuilder().Append($"{urlParams}/?");
var pageValue = page ?? 1;
new StringBuilder().Append("page=" + pageValue);
var limitValue = limit ?? 5;
new StringBuilder().Append("&limit=" + limitValue);
var response = testContext.Get(new StringBuilder().ToString()).Result;
StatusCode = response.StatusCode;
if (HttpStatusCode.OK.Equals(StatusCode))
{
response.EnsureSuccessStatusCode();
ResultList = response.Content.ReadAsAsync<List<T>>().Result;
}
return (TBuilder)this;
}
public TBuilder Put(TestContext testContext, int id, T entity, string api = null)
{
var urlParams = UrlWithParams(api);
var response = testContext.Put($"{urlParams}/{id}", entity).Result;
StatusCode = response.StatusCode;
if (HttpStatusCode.OK.Equals(StatusCode))
{
response.EnsureSuccessStatusCode();
Result = response.Content.ReadAsAsync<T>().Result;
}
return (TBuilder)this;
}
public TBuilder Delete(TestContext testContext, int id, string api = null)
{
var urlParams = UrlWithParams(api);
var responseDelete = testContext.Delete($"{urlParams}/{id}").Result;
StatusCode = responseDelete.StatusCode;
if (HttpStatusCode.OK.Equals(StatusCode))
{
responseDelete.EnsureSuccessStatusCode();
}
return (TBuilder)this;
}
protected string UrlWithParams(string api)
{
return !string.IsNullOrEmpty(api) ? $"{this.url}/{api}" : $"{this.url}";
}
public Results<T, TBuilder> Build() => this;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment