/// <summary> /// Dada una lista de preguntas, las inserta en la base de datos /// Devuelve la cantidad de preguntas insertada con exito /// </summary> public static int CargarPreguntas(IEnumerable <Pregunta> pPreguntas) { /// Este metodo es horriblemente ineficiente /// Pero fue la unica forma que encontre de hacerlo andar int cantidad = 0; foreach (Pregunta pre in pPreguntas) { using (var db = new TrabajoDbContext()) { using (var UoW = new UnitOfWork(db)) { // si la pregunta no existe if (UoW.RepositorioPreguntas.Get(pre.Id) == null) { cantidad++; ConjuntoPreguntas conjunto = UoW.RepositorioConjuntoPregunta.Get(pre.Conjunto.Id); pre.Conjunto = conjunto; UoW.RepositorioPreguntas.Add(pre); } UoW.Complete(); } } } return(cantidad); }
/// <summary> /// Dada una web response y un conjunto, construye las preguntas /// </summary> /// <exception cref="JsonReaderException">Si webResponse no tiene formato adecuado</exception> /// <param name="webResponse"></param> /// <param name="pConjunto"></param> /// <returns>Preguntas construidas</returns> public IEnumerable <Pregunta> ParseResponse(WebResponse webResponse, ConjuntoPreguntas pConjunto) { var preguntas = new List <Pregunta>(); using (Stream responseStream = webResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); // Se parsea la respuesta y se serializa a JSON a un objeto dynamic dynamic mResponseJSON = JsonConvert.DeserializeObject(reader.ReadToEnd()); // Se iteran cada uno de los resultados. foreach (var bResponseItem in mResponseJSON.results) { // De esta manera se accede a los componentes de cada item string textoPregunta = HttpUtility.HtmlDecode(bResponseItem.question.ToString()); string nombreCategoria = bResponseItem.category.ToString(); string nombreDificultad = HttpUtility.HtmlDecode(bResponseItem.difficulty.ToString()); var respuestas = new List <Respuesta>(); if ((nombreCategoria != pConjunto.Categoria.Id) || (nombreDificultad != pConjunto.Dificultad.Id)) { throw new FormatException(String.Format("Recibio otra cosa de la api {0} = {1}, {2} = {3}", nombreCategoria, pConjunto.Categoria.Id, nombreDificultad, pConjunto.Dificultad.Id)); } //Obtiene el texto de la respuesta correcta string textorespuestaCorrecta = HttpUtility.HtmlDecode(bResponseItem.correct_answer.ToString()); //Obtiene el texto de las respuestas incorrectas List <string> textoincorrectas = bResponseItem.incorrect_answers.ToObject <List <string> >(); //Crea la pregunta Pregunta preg = new Pregunta(textoPregunta, pConjunto); //Crea la respuesta correcta Respuesta respuestaCorrecta = new Respuesta(textorespuestaCorrecta, true); //Añade respuesta correcta a la lista respuestas.Add(respuestaCorrecta); //Por cada respuesta incorrecta, crea una respuesta y la añade a la lista foreach (string tri in textoincorrectas) { Respuesta res = new Respuesta(HttpUtility.HtmlDecode(tri), false); respuestas.Add(res); } // Asocias las respuestas con la pregunta preg.Respuestas = respuestas; //se agrega cada una de las preguntas a la lista preguntas.Add(preg); } } return(preguntas); }
public void DescargarPreguintas_ConjuntoInvalido_DevuelveListaDePreguntas() { IEstrategiaObtenerPreguntas opentDb = new OpentDbEstrategiaObtenerPreguntas(); var conjuntoVacio = new ConjuntoPreguntas(); Assert.ThrowsException <ArgumentNullException>(() => opentDb.DescargarPreguntas(0, conjuntoVacio)); Assert.ThrowsException <ArgumentNullException>(() => opentDb.DescargarPreguntas(10, conjuntoVacio)); }
public string CrearUrl(int pCantidad, ConjuntoPreguntas pConjunto) { var url = string.Format("https://opentdb.com/api.php?amount={0}&category={1}&difficulty={2}&type=multiple", pCantidad, pConjunto.Categoria.ProviderId, pConjunto.Dificultad.Id); return(url); }
public void TestDescargarPreguntas_ParametrosValidos_DevuelvePreguntas() { var dificultad = new Dificultad("easy"); var categoria = new CategoriaPregunta("Science: Computers", "18"); var conjunto = new ConjuntoPreguntas("OpentDb", dificultad, categoria); var opentdb = new OpentDbEstrategiaObtenerPreguntas(); var res = opentdb.DescargarPreguntas(10, conjunto); Assert.IsTrue(res.Any()); }
/// <summary> /// Metodo que modifica el tiempo esperado por respuesta de un conjunto pasado como parametro. /// </summary> /// <param name="pConjuntoPreguntas"></param> /// <param name="pTiempo"></param> public void ModificarTiempo(string pConjuntoPreguntas, float pTiempo) { using (var db = new TrabajoDbContext()) { using (var UoW = new UnitOfWork(db)) { ConjuntoPreguntas conjunto = UoW.RepositorioConjuntoPregunta.Get(pConjuntoPreguntas); conjunto.Id = pConjuntoPreguntas; UoW.Complete(); } } }
public void TestDescargarPreguntas_CantidadCero_DevuelveListaVacia() { var opentdb = new OpentDbEstrategiaObtenerPreguntas(); var dificultad = new Dificultad("easy"); var categoria = new CategoriaPregunta("Science: Computers", "18"); var conjunto = new ConjuntoPreguntas("OpentDb", dificultad, categoria); var res = opentdb.DescargarPreguntas(0, conjunto); Assert.IsFalse(res.Any()); }
public void DescargarPreguintas_ConjuntoValido_DevuelveListaDePreguntas() { IEstrategiaObtenerPreguntas opentDb = new OpentDbEstrategiaObtenerPreguntas(); var dificultad = new Dificultad("easy"); var categoria = new CategoriaPregunta("Science: Computers", "18"); var conjuntoExistente = new ConjuntoPreguntas("OpentDb", dificultad, categoria); var preguntasVacio = opentDb.DescargarPreguntas(0, conjuntoExistente); var preguntas = opentDb.DescargarPreguntas(10, conjuntoExistente); Assert.IsFalse(preguntasVacio.Any()); Assert.IsTrue(preguntas.ToList().Count > 1); }
/// <summary> /// </summary> /// <exception cref="WebException"></exception> /// <exception cref="FormatException"></exception> /// <exception cref="ArgumentNullException"></exception> /// <param name="pCantidad"></param> /// <param name="pConjunto"></param> /// <returns></returns> public override IEnumerable <Pregunta> DescargarPreguntas(int pCantidad, ConjuntoPreguntas pConjunto) { if ((pConjunto == null) || (pConjunto.Categoria == null) || (pConjunto.Dificultad == null) || String.IsNullOrEmpty(pConjunto.Nombre)) { throw new ArgumentNullException(); } if (pCantidad == 0) { return(new List <Pregunta>()); } var url = iUrlCreador.CrearUrl(pCantidad, pConjunto); var response = iWebRequester.PeticionAUrl(url); return(iParser.ParseResponse(response, pConjunto)); }
public void TestDescargarPreguntas_ParametrosInvalidos_DevuelveExcepcion() { var opentdb = new OpentDbEstrategiaObtenerPreguntas(); Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(0, null)); Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(100, null)); var dificultad = new Dificultad("easy"); var categoria = new CategoriaPregunta("Science: Computers", "18"); var conjuntoConPropiedadNull = new ConjuntoPreguntas("OpentDb", dificultad, categoria); conjuntoConPropiedadNull.Categoria = null; Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(0, conjuntoConPropiedadNull)); Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(100, conjuntoConPropiedadNull)); conjuntoConPropiedadNull.Categoria = categoria; conjuntoConPropiedadNull.Dificultad = null; Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(0, conjuntoConPropiedadNull)); Assert.ThrowsException <ArgumentNullException>(() => opentdb.DescargarPreguntas(100, conjuntoConPropiedadNull)); }
public abstract IEnumerable <Pregunta> DescargarPreguntas(int pCantidad, ConjuntoPreguntas pConjunto);
public override IEnumerable <Pregunta> DescargarPreguntas(int pCantidad, ConjuntoPreguntas pConjunto) { throw new NotImplementedException(); }
public ConjuntoPreguntasDTO(ConjuntoPreguntas conjuntoPreguntas) { this.TiempoEsperadoRespuesta = conjuntoPreguntas.TiempoEsperadoRespuesta; this.Id = conjuntoPreguntas.Id; this.Nombre = conjuntoPreguntas.Nombre; }
/// <summary> /// Dada una lista de preguntas, las inserta en la base de datos /// </summary> public void CargarPreguntas(List <Pregunta> pPreguntas) { try { using (var db = new TrabajoDbContext()) { using (var UoW = new UnitOfWork(db)) { foreach (Pregunta pre in pPreguntas) { if (db.Preguntas.Find(pre.Id) == null) { CategoriaPregunta categoria = db.Categorias.Find(pre.Categoria.Id); Dificultad dificultad = db.Dificultades.Find(pre.Dificultad.Id); ConjuntoPreguntas conjunto = db.ConjuntoPreguntas.Find(pre.Conjunto.Id); ///Si la categoria esta en la base de datos la referencia, ///sino crea una nueva y la inserta en la db if (categoria == null) { CategoriaPregunta categoriaNueva = new CategoriaPregunta(pre.Categoria.Id); } else { pre.Categoria = categoria; } ///Si la dificultad esta en la base de datos la referencia, ///sino crea una nueva y la inserta en la db if (dificultad == null) { Dificultad dificultadNueva = new Dificultad(pre.Dificultad.Id); } else { pre.Dificultad = dificultad; } ///Si el conjunto esta en la base de datos la referencia, ///sino crea uno nuevo y la inserta en la db if (conjunto == null) { ConjuntoPreguntas conjuntoNuevo = new ConjuntoPreguntas(pre.Conjunto.Id); } else { pre.Conjunto = conjunto; } UoW.RepositorioPreguntas.Add(pre); } } UoW.Complete(); } } } catch (Exception ex) { Bitacora.GuardarLog(ex.Message.ToString()); } }