Giter Club home page Giter Club logo

eg-lista-correo-xtend's Introduction

Ejercicio de Diseño - Lista de Correo

Build Status Coverage Status

Dominio

Queremos modelar una lista de correo

  • cuya suscripción pueda ser moderada por un administrador o bien ser libre
  • cuyo envío de mails pueda ser abierto o cerrado

Dejamos aquí el link al enunciado completo

Conceptos a ver

Muestra cómo implementar los patrones

  • Strategy: para envío de mails a una lista abierta/restringida,
  • Observer: diferentes comportamientos ante el envío de posts
  • y cómo testear con stubs/mocks para simular el envío de mails.

Utiliza el framework Mockito para trabajar con mocks. Dejamos el link a la explicación del ejercicio

Branches de soluciones alternativas

  • branch simple: es una versión simplificada del ejercicio, que no utiliza observers ya que solo le interesa enviar mail como única acción al recibir un mensaje.
  • branch master: tenés la solución que trabaja la inyección de dependencias del MessageSender en el constructor del MailObserver
  • branch singleton: el componente que envía mails es un Stub Singleton y dificulta seriamente los tests (falla el test de mockito porque no se puede cambiar dinámicamente la implementación del messageSender)
  • branch service-locator: implementa el patrón arquitectural Service Locator como una forma de desacoplar el MessageSender a utilizar para el test unitario vs. el que usaríamos en la aplicación.

Branches de otras soluciones

  • branch strategy-bloques: utiliza strategies con bloques de código que implementan una interfaz Validador + un builder para construir la lista
  • branch decorator: decora la lista común para generar listas de envío restringido. **Atención: ** La solución es compleja y difícil de seguir, no es recomendable para estudiar por primera vez el Decorator.

Objetivo de master

En este branch, el test que valida el envío de mails asigna un messageSender por defecto:

@DisplayName("Dada una lista de envío abierto")
class TestEnvioAbierto {

	...
	@BeforeEach
	def void init() {
		mockedMailSender = mock(MessageSender)
		stubMailSender = new StubMailSender

La prueba específica de un MailSender que se mockea con el framework Mockito se hace incorporando un nuevo observer que tiene constructor injection, es decir que en el constructor le paso la dependencia al mail sender:

	@Test
	@DisplayName("Al enviar un post le llega el mensaje a todos los demás suscriptos menos")
	def void testEnvioPostAListaAlumnosLlegaATodosLosOtrosSuscriptos() {
		listaEnvioAbierto.agregarPostObserver(new MailObserver(mockedMailSender))

		// un alumno envía un mensaje a la lista
		listaEnvioAbierto.recibirPost(mensajeDodainAlumnos)

		//verificacion
		//test de comportamiento, verifico que se enviaron 2 mails 
		// a fede y a deby, no así a dodi que fue el que envió el post
		verify(mockedMailSender, times(2)).send(any(Mail))
	}

Entonces al MailObserver le inyectamos en el constructor el messageSender que utiliza el método send():

class MailObserver implements PostObserver {
	MessageSender messageSender

	new(MessageSender _messageSender) {
		messageSender = _messageSender
	}

	override send(Post post, ListaCorreo lista) {
		lista.getMailsDestino(post).forEach [ mailDestino |
			val mail = new Mail => [
				from = post.emisor.mail
				titulo = "[" + lista.encabezado + "] nuevo post"
				message = post.mensaje
				to = mailDestino
			]
			messageSender.send(mail)
		]
	}

}

Gráfico general

A continuación dejamos un gráfico general de la solución:

imagen

eg-lista-correo-xtend's People

Contributors

fdodino avatar

Watchers

Franco Leonardo Bulgarelli avatar Deby avatar James Cloos avatar Federico Scarpa avatar Ernesto Bossi avatar  avatar Juan José Contardo avatar  avatar Leo Gassman avatar Javier Fernandes avatar Nico Passerini avatar Alejandro Dini avatar Julian Karp avatar  avatar  avatar

Forkers

iivaan-m

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.