main
  1package testing
  2
  3import "github.com/stretchr/testify/assert"
  4import "movies/domain"
  5import "testing"
  6
  7func TestMovieLibrary(t *testing.T) {
  8	subject := domain.MovieLibrary{}
  9
 10	pixar := domain.Studio{Name: "Pixar"}
 11	disney := domain.Studio{Name: "Disney"}
 12	castle_rock := domain.Studio{Name: "Castle Rock"}
 13	miramax_films := domain.Studio{Name: "Miramax"}
 14	regency_enterprises := domain.Studio{Name: "Regency"}
 15
 16	shawshank_redemption := domain.Movie{Title: "The Shawshank Redemption", Year: 1994, Studio: castle_rock}
 17	chasing_amy := domain.Movie{Title: "Chasing Amy", Studio: miramax_films, Year: 1997}
 18	man_on_fire := domain.Movie{Title: "Man on Fire", Studio: regency_enterprises, Year: 2004}
 19	toy_story := domain.Movie{Title: "Toy Story", Studio: pixar, Year: 1995}
 20	up := domain.Movie{Title: "Up", Studio: pixar, Year: 2006}
 21	cars := domain.Movie{Title: "Cars", Studio: pixar, Year: 2009}
 22	monsters_inc := domain.Movie{Title: "Monsters Inc.", Studio: pixar, Year: 2001}
 23	fantasia := domain.Movie{Title: "Fantasia", Studio: disney, Year: 1940}
 24	dumbo := domain.Movie{Title: "Dumbo", Studio: disney, Year: 1941}
 25	pinocchio := domain.Movie{Title: "Pinocchio", Studio: disney, Year: 1940}
 26
 27	t.Run("Add", func(t *testing.T) {
 28		t.Run("when adding a movie to the library", func(t *testing.T) {
 29			subject.Add(shawshank_redemption)
 30			subject.Add(chasing_amy)
 31			subject.Add(man_on_fire)
 32			subject.Add(toy_story)
 33			subject.Add(up)
 34			subject.Add(cars)
 35			subject.Add(monsters_inc)
 36			subject.Add(fantasia)
 37			subject.Add(dumbo)
 38			subject.Add(pinocchio)
 39
 40			t.Run("increases the total number of movies in the library", func(t *testing.T) {
 41				assert.Equal(t, 10, subject.Count())
 42			})
 43
 44			t.Run("does not allow duplicates", func(t *testing.T) {
 45				subject.Add(man_on_fire)
 46
 47				assert.Equal(t, 10, subject.Count())
 48			})
 49		})
 50	})
 51
 52	t.Run("Find", func(t *testing.T) {
 53		subject.Add(shawshank_redemption)
 54		subject.Add(chasing_amy)
 55		subject.Add(man_on_fire)
 56		subject.Add(toy_story)
 57		subject.Add(up)
 58		subject.Add(cars)
 59		subject.Add(monsters_inc)
 60		subject.Add(fantasia)
 61		subject.Add(dumbo)
 62		subject.Add(pinocchio)
 63
 64		t.Run("returns all Pixar movies", func(t *testing.T) {
 65			movies := subject.FindAllMoviesByPixar()
 66			expected := [...]domain.Movie{toy_story, cars, up, monsters_inc}
 67
 68			assert.ElementsMatch(t, expected, movies)
 69		})
 70
 71		t.Run("returns all movies published by Pixar or Disney", func(t *testing.T) {
 72			movies := subject.FindAllMoviesByPixarOrDisney()
 73			expected := [...]domain.Movie{toy_story, cars, up, monsters_inc, fantasia, dumbo, pinocchio}
 74
 75			assert.ElementsMatch(t, expected, movies)
 76		})
 77
 78		t.Run("returns all movies not published by Pixar", func(t *testing.T) {
 79			movies := subject.FindAllMoviesNotByPixar()
 80			expected := [...]domain.Movie{
 81				chasing_amy,
 82				dumbo,
 83				fantasia,
 84				man_on_fire,
 85				pinocchio,
 86				shawshank_redemption,
 87			}
 88
 89			assert.ElementsMatch(t, expected, movies)
 90		})
 91
 92		t.Run("returns all movies released after 2004", func(t *testing.T) {
 93			movies := subject.FindAllMoviesPublishedAfter2004()
 94			expected := [...]domain.Movie{cars, up}
 95
 96			assert.ElementsMatch(t, expected, movies)
 97		})
 98
 99		t.Run("returns all movies released between 1982 and 2003 - inclusive", func(t *testing.T) {
100			movies := subject.FindAllMoviesPublishedBetween1982And2003()
101			expected := [...]domain.Movie{shawshank_redemption, chasing_amy, toy_story, monsters_inc}
102
103			assert.ElementsMatch(t, expected, movies)
104		})
105	})
106}