class MoviesNotifierTest(UnitTestBase):

  searchUrl = "http://search.url/usearch"

  def setUp(self):
    self.moviesRepository = MovieRepository()
    self.notificationListener = NotificationListener()
    self.webpageFactory = MagicMock()
    self.webpage = MagicMock()
    self.moviesNotifier = MoviesNotifier(self.moviesRepository, self.webpageFactory, self.notificationListener)

  def test_notifyNewFilmWithEmptyRepository(self):
    alreadyNotifiedMovies = []
    moviesFromWebpage = [Movie("Titolo del nuovo iTALiAN film", 44)]
    self.__setupMocks(moviesFromWebpage, alreadyNotifiedMovies)

    self.moviesNotifier.work()

    self.moviesRepository.alreadyNotified.assert_called_once_with()
    self.notificationListener.send.assert_called_once_with("Titolo del nuovo iTALiAN film")
    self.moviesRepository.add.assert_called_once_with(Movie("Titolo del nuovo iTALiAN film"))

  def test_notifyNewFilmWithFullRepository(self):
    alreadyNotifiedMovies = [
      Movie("Film gia notificato"),
      Movie("Film notificato non piu presente nella pagina")
    ]
    moviesFromWebpage = [
      Movie("Film gia notificato", 66),
      Movie("Nuovo iTALiAN film non notificato", 40)
    ]
    self.__setupMocks(moviesFromWebpage, alreadyNotifiedMovies)

    self.moviesNotifier.work()

    self.moviesRepository.alreadyNotified.assert_called_once_with()
    self.notificationListener.send.assert_called_once_with("Nuovo iTALiAN film non notificato")
    self.moviesRepository.add.assert_called_once_with(Movie("Nuovo iTALiAN film non notificato", 40))

  def test_noNotificationWithNoNewFilms(self):
    alreadyNotifiedMovies = [
      Movie("Film gia notificato"),
      Movie("Film notificato non piu presente nella pagina"),
      Movie("Nuovo iTALiAN film non notificato")
    ]
    moviesFromWebpage = [
      Movie("Film gia notificato", 430),
      Movie("Nuovo iTALiAN film non notificato", 134)
    ]

    self.__setupMocks(moviesFromWebpage, alreadyNotifiedMovies)

    self.moviesNotifier.work()

    self.moviesRepository.alreadyNotified.assert_called_once_with()
    self.notificationListener.send.assert_not_called()
    self.moviesRepository.add.assert_not_called()

  
  def __setupMocks(self, moviesFromWebpage, alreadyNotifiedMovies):
    self.moviesRepository.alreadyNotified = MagicMock(return_value=alreadyNotifiedMovies)
    self.notificationListener.send = MagicMock()
    self.moviesRepository.add = MagicMock()
    self.webpage.movies = MagicMock(return_value=moviesFromWebpage)
    self.webpageFactory.build = MagicMock(return_value=self.webpage)
import os

from moviesnotifier import (
  MoviesNotifier, SqlLiteMovieRepository, UrlLibHtmlRetriever,
  PrintNotificationListener, IFNotifier, NotificationListenerList,
  CorsaroneroWebpageFactory
)

def absolutePathFromRelative(relative):
  currentDirectory = os.path.dirname(__file__)
  return os.path.join(currentDirectory, relative)

################################### BEGIN

notificationListeners = NotificationListenerList([
  IFNotifier(),
  PrintNotificationListener()
])

moviesNotifier = MoviesNotifier(
  SqlLiteMovieRepository(absolutePathFromRelative('production.db')),
  CorsaroneroWebpageFactory(UrlLibHtmlRetriever()),
  notificationListeners
)
moviesNotifier.work()
 def setUp(self):
   self.moviesRepository = MovieRepository()
   self.notificationListener = NotificationListener()
   self.webpageFactory = MagicMock()
   self.webpage = MagicMock()
   self.moviesNotifier = MoviesNotifier(self.moviesRepository, self.webpageFactory, self.notificationListener)