public static final Movie testMovie = new Movie(); public static Date testMovieChangesEndDate; public static Date testMovieChangesStartDate; public static void assertCredits(Credits credits) {
    assertThat(credits).isNotNull();

    assertCastCredits(credits.cast);
    assertCrewCredits(credits.crew);

    if (credits.guest_stars != null) {
        assertCastCredits(credits.guest_stars);
    }

} public static void assertAlternativeTitles(AlternativeTitles alternativeTitles) {
    assertThat(alternativeTitles).isNotNull();
    assertThat(alternativeTitles.titles).isNotNull();
    assertThat(alternativeTitles.titles).isNotEmpty();
    for (AlternativeTitle alternativeTitle : alternativeTitles.titles) {
        assertThat(alternativeTitle).isNotNull();
        assertThat(alternativeTitle.iso_3166_1).isNotNull();
        assertThat(alternativeTitle.title).isNotNull();
    }
} public static void assertImages(List<Image> images) {
    assertThat(images).isNotNull();
    assertThat(images).isNotEmpty();
    for (Image image : images) {
        assertImage(image);
    }
} public static void assertTranslations(Translations translations) {
    assertThat(translations).isNotNull();
    assertThat(translations.translations).isNotNull();
    assertThat(translations.translations).isNotEmpty();
    for (Translations.Translation translation : translations.translations) {
        assertThat(translation.english_name).isNotNull();
        assertThat(translation.name).isNotNull();
        assertThat(translation.iso_639_1).isNotNull();
        assertThat(translation.iso_3166_1).isNotNull();
        assertThat(translation.data).isNotNull();
    }
} public static void assertVideos(Videos videos) {
    for (Videos.Video video : videos.results) {
        assertThat(video).isNotNull();
        assertThat(video.id).isNotNull();
        assertThat(video.iso_639_1).isNotNull();
        assertThat(video.key).isNotNull();
        assertThat(video.name).isNotNull();
        assertThat(video.site).isNotNull();
        assertThat(video.size).isNotNull();
        assertThat(video.type).isNotNull();
    }
} public static void assertWatchProviderCountryInfo(WatchProviders.CountryInfo info) {
    assertWatchProviders(info.flatrate);
    assertWatchProviders(info.free);
    assertWatchProviders(info.ads);
    assertWatchProviders(info.buy);
} public static void assertListResultsPage(ListResultsPage listResultsPage) {
    assertBaseResultsPage(listResultsPage);

    for (BaseList list : listResultsPage.results) {
        assertBaseList(list);
    }

} public static void assertMovie(Movie movie) {
    assertBaseMovie(movie);
    assertThat(movie.tagline).isNotEmpty();
    assertThat(movie.spoken_languages).isNotNull();
    assertThat(movie.homepage).isNotNull();
    assertThat(movie.budget).isNotNull();
    assertThat(movie.imdb_id).isNotNull();
    assertThat(movie.belongs_to_collection).isNotNull();
    assertThat(movie.belongs_to_collection.id).isNotNull();
    assertThat(movie.belongs_to_collection.name).isNotNull();
    assertThat(movie.production_countries).isNotNull();

    for (BaseCompany company : movie.production_companies) {
        assertBaseCompany(company, false);
    }

    assertThat(movie.revenue).isNotNull();
    assertThat(movie.status).isNotNull();
} public static void assertMovieDataIntegrity(Movie movie) {
    assertMovie(movie);
    assertThat(movie.budget).isGreaterThan(0);
    assertThat(movie.imdb_id).isEqualTo(TestData.testMovie.imdb_id);
    assertThat(movie.production_companies).isNotEmpty();
    assertThat(movie.production_companies.get(0).id).isEqualTo(testProductionCompany.id);
    assertThat(movie.production_companies.get(0).name).isEqualTo(testProductionCompany.name);
    assertThat(movie.production_countries).isNotEmpty();
    assertThat(movie.production_countries.get(0).iso_3166_1).isEqualTo("US");
    assertThat(movie.production_countries.get(0).name).isEqualTo("United States of America");
    assertThat(movie.revenue).isGreaterThan(0);
    assertThat(movie.runtime).isEqualTo(TestData.testMovie.runtime);
    assertThat(movie.spoken_languages.get(0).iso_639_1).isEqualTo("en");
    assertThat(movie.spoken_languages.get(0).name).isEqualTo("English");
    assertThat(movie.status).isEqualTo(TestData.testMovie.status);
    assertThat(movie.release_date).isEqualTo(TestData.testMovie.release_date);
    assertThat(movie.title).isEqualTo(TestData.testMovie.title);
    assertThat(movie.original_title).isEqualTo(TestData.testMovie.original_title);
    assertThat(movie.original_language).isEqualTo(TestData.testMovie.original_language);
    assertThat(movie.belongs_to_collection.name).isEqualTo(TestData.testCollection.name);
    assertThat(movie.belongs_to_collection.id).isEqualTo(TestData.testCollection.id);
    assertThat(movie.id).isEqualTo(TestData.testMovie.id);
} public static void assertMovieReleaseDates(ReleaseDatesResults releaseDates) {
    assertThat(releaseDates).isNotNull();
    assertThat(releaseDates.results).isNotNull();
    assertThat(releaseDates.results).isNotEmpty();

    for (ReleaseDatesResult result : releaseDates.results) {
        assertThat(result.iso_3166_1).isNotNull();
        assertThat(result.release_dates).isNotNull();
        assertThat(result.release_dates).isNotEmpty();
        for (ReleaseDate releaseDate : result.release_dates) {
            assertThat(releaseDate.certification).isNotNull();
            assertThat(releaseDate.note).isNotNull();
            assertThat(releaseDate.release_date).isNotNull();
            assertThat(releaseDate.type).isNotNull();
        }
    }
} public static void assertMovieResultsPage(MovieResultsPage movieResultsPage) {
    assertBaseResultsPage(movieResultsPage);
    for (BaseMovie baseMovie : movieResultsPage.results) {
        assertBaseMovie(baseMovie);
    }
} public static void assertReviews(ReviewResultsPage reviewResultsPage) {
    assertBaseResultsPage(reviewResultsPage);
    assertThat(reviewResultsPage.results).isNotNull();
    assertThat(reviewResultsPage.results).isNotEmpty();
    for (Review review : reviewResultsPage.results) {
        assertReview(review, false);
    }
} public abstract class BaseTestCase {

    private static final boolean LOG_BODY = System.getenv("CI") == null;

    // Do NOT use this API key in your application, it is only for testing tmdb-java!
    private static final String TEST_API_KEY = "25da90e9f8f0b3892d8bdeb6c3d6267d";
    // limit requests for tests to avoid hitting TMDb rate limit (40 requests/10 seconds)
    @SuppressWarnings("UnstableApiUsage") private static final RateLimiter rateLimiter = RateLimiter.create(5);

    private static final Tmdb unauthenticatedInstance = new BaseTestCase.TestTmdb(TEST_API_KEY);
    private static final Tmdb authenticatedInstance  = new BaseTestCase.TestTmdb(TEST_API_KEY);

    protected static Tmdb getUnauthenticatedInstance() {
        return unauthenticatedInstance;
    }

    protected static Tmdb getAuthenticatedInstance() {
        return authenticatedInstance;
    }

    private static class TestTmdb extends Tmdb {
        public TestTmdb(String apiKey) {
            super(apiKey);
        }

        @Override
        protected void setOkHttpClientDefaults(OkHttpClient.Builder builder) {
            final Tmdb instance = this;
            builder.authenticator(new TmdbAuthenticator(instance));
            builder.addInterceptor(chain -> {
                rateLimiter.acquire();
                return TmdbInterceptor.handleIntercept(chain, instance);
            });
            // add logging, standard output is easier to read
            // but only log headers on CI to keep logs short
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor(System.out::println);
            logging.setLevel(LOG_BODY ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.BASIC);
            builder.addNetworkInterceptor(logging);
        }
    }

} public class TestData {

    private static final SimpleDateFormat JSON_STRING_DATE = new SimpleDateFormat("yyy-MM-dd");

    public static final Person testPerson = new Person();
    public static Date testPersonChangesStartDate;
    public static Date testPersonChangesEndDate;

    public static final Person testPersonCast = new Person();
    public static final Person testPersonCrew = new Person();

    public static final Movie testMovie = new Movie();
    public static Date testMovieChangesStartDate;
    public static Date testMovieChangesEndDate;

    public static final Credit testCredit = new Credit();

    public static final Collection testCollection = new Collection();

    public static final Genre testMovieGenreAdventure = new Genre();
    public static final Genre testMovieGenreRomance = new Genre();
    public static final Genre testTvGenreDrama = new Genre();
    public static final Genre testTvGenreSciFi = new Genre();

    public static final Network testNetwork = new Network();

    public static final Review testReview = new Review();

    public static final Company testMovieCompany = new Company();
    public static final BaseCompany testProductionCompany = testMovieCompany;
    public static final Company testCompany = new Company();


    public static final TvShow testTvShow = new TvShow();
    public static Date testTvShowChangesStartDate;
    public static Date testTvShowChangesEndDate;

    public static final TvSeason testTvSeason = new TvSeason();
    public static Date testTvSeasonChangesStartDate;
    public static Date testTvSeasonChangesEndDate;

    public static final TvEpisode testTvEpisode = new TvEpisode();
    public static Date testTvEpisodeChangesStartDate;
    public static Date testTvEpisodeChangesEndDate;

    public static final BaseKeyword testKeyword = new BaseKeyword();

    public static final java.util.List<Integer> testListMovies = new ArrayList<>();

    static {
        try {
            initializeTestingIntegrityData();
        } catch (ParseException e) {
            throw new RuntimeException("TestData setup failed.", e);
        }
    }

    private static void initializeTestingIntegrityData() throws ParseException {
        testCompany.id = 5;
        testCompany.name = "Columbia Pictures";
        testCompany.origin_country = "US";

        testPerson.name = "Ben Affleck";
        testPerson.birthday = JSON_STRING_DATE.parse("1972-08-15");
        testPerson.gender = 2;
        testPerson.id = 880;
        testPerson.imdb_id = "nm0000255";
        testPerson.place_of_birth = "Berkeley, California, USA";
        testPerson.adult = false;

        testPersonChangesStartDate = JSON_STRING_DATE.parse("2016-12-16");
        testPersonChangesEndDate = JSON_STRING_DATE.parse("2016-12-28");

        testPersonCast.id = 287;
        testPersonCast.name = "Brad Pitt";

        testPersonCrew.id = 7467;
        testPersonCrew.name = "David Fincher";

        testMovieGenreAdventure.name = "Adventure";
        testMovieGenreAdventure.id = 12;

        testMovieGenreRomance.name = "Romance";
        testMovieGenreRomance.id = 10749;

        testTvGenreDrama.name = "Drama";
        testTvGenreDrama.id = 18;

        testTvGenreSciFi.name = "Sci-Fi & Fantasy";
        testTvGenreSciFi.id = 10765;

        testNetwork.id = 49;
        testNetwork.name = "HBO";

        testMovieCompany.name = "Marvel Studios";
        testMovieCompany.id = 420;

        testMovie.id = 24428;
        testMovie.title = "The Avengers";
        testMovie.original_title = "The Avengers";
        testMovie.status = Status.RELEASED;
        testMovie.runtime = 143;
        testMovie.revenue = 1519557910L;
        testMovie.release_date = JSON_STRING_DATE.parse("2012-04-25");
        testMovie.original_language = "en";
        testMovie.imdb_id = "tt0848228";
        testMovie.adult = false;

        testMovieChangesStartDate = JSON_STRING_DATE.parse("2017-3-24");
        testMovieChangesEndDate = JSON_STRING_DATE.parse("2017-4-2");

        testCollection.id = 86311;
        testCollection.name = "The Avengers Collection";

        testTvShow.name = "The Simpsons";
        testTvShow.first_air_date = JSON_STRING_DATE.parse("1989-12-17");
        testTvShow.id = 456;
        testTvShow.original_language = "en";
        testTvShow.original_name = "The Simpsons";
        testTvShow.type = "Scripted";
        testTvShow.external_ids = new TvExternalIds();
        testTvShow.external_ids.imdb_id = "tt0096697";
        testTvShow.external_ids.tvdb_id = 71663;
        testTvShow.external_ids.facebook_id = "TheSimpsons";
        testTvShow.external_ids.freebase_mid = "/m/07c72";
        testTvShow.external_ids.freebase_id = "/en/the_simpsons";
        testTvShow.external_ids.instagram_id= "thesimpsonsfox";
        testTvShow.external_ids.tvrage_id = 6190;
        testTvShow.external_ids.twitter_id = "thesimpsons";
        testTvShow.external_ids.id = testTvShow.id;
        testTvShowChangesStartDate = JSON_STRING_DATE.parse("2017-2-2");
        testTvShowChangesEndDate = JSON_STRING_DATE.parse("2017-2-4");

        testTvSeason._id = "5256c24719c2956ff600565b";
        testTvSeason.id = 3582;
        testTvSeason.season_number = 1;
        testTvSeason.name = "Season 1";
        testTvSeason.air_date = JSON_STRING_DATE.parse("1989-12-17");
        testTvSeason.episodes = new ArrayList<>();
        for (int i = 0; i < 13; i++) {
            testTvSeason.episodes.add(new TvEpisode());
        }
        testTvSeason.external_ids = new TvSeasonExternalIds();
        testTvSeason.external_ids.tvdb_id = 2727;
        testTvSeason.external_ids.tvrage_id = 0;
        testTvSeason.external_ids.freebase_id = "/en/the_simpsons_season_1";
        testTvSeason.external_ids.freebase_mid = "/m/0cmqz_";
        testTvSeasonChangesStartDate = JSON_STRING_DATE.parse("2015-10-10");
        testTvSeasonChangesEndDate = JSON_STRING_DATE.parse("2015-10-24");

        testTvEpisode.name = "Simpsons Roasting on an Open Fire";
        testTvEpisode.id = 62228;
        testTvEpisode.season_number = 1;
        testTvEpisode.episode_number = 1;
        testTvEpisode.air_date = JSON_STRING_DATE.parse("1989-12-17");
        testTvEpisode.external_ids = new TvEpisodeExternalIds();
        testTvEpisode.external_ids.imdb_id = "tt0348034";
        testTvEpisode.external_ids.freebase_mid = "/m/0129zr";
        testTvEpisode.external_ids.freebase_id = "/en/simpsons_roasting_on_an_open_fire";
        testTvEpisode.external_ids.tvdb_id = 55452;
        testTvEpisode.external_ids.tvrage_id = 206468;
        testTvEpisodeChangesStartDate = JSON_STRING_DATE.parse("2017-2-2");
        testTvEpisodeChangesEndDate = JSON_STRING_DATE.parse("2017-2-4");

        testCredit.credit_type = CreditType.CAST;
        testCredit.department = "Acting";
        testCredit.job = "Actor";
        testCredit.media_type = MediaType.TV;
        testCredit.id = "5256bdc319c2956ff6001554";
        testCredit.media = new CreditMedia();
        testCredit.media.id = 456;
        testCredit.media.name = "The Simpsons";
        testCredit.media.original_name = "The Simpsons";

        testReview.id = "581bbdbbc3a36805c60001f1";
        testReview.iso_639_1 = "en";
        testReview.media_id = 284052;
        testReview.media_title = "Doctor Strange";
        testReview.url = "https://www.themoviedb.org/review/581bbdbbc3a36805c60001f1";

        testKeyword.id = 1721;
        testKeyword.name = "fight";


        testListMovies.add(testMovie.id);
        testListMovies.add(550);
        testListMovies.add(99861);
        testListMovies.add(293660);
    }

} public class Images {

    public Integer id;
    public List<Image> backdrops;
    public List<Image> posters;
    public List<Image> stills;

} public class Keywords {

    public Integer id;

    @SerializedName(value = "keywords", alternate = {"results"})
    public List<BaseKeyword> keywords;

} public class Movie extends BaseMovie {

    public Collection belongs_to_collection;
    public Long budget;
    public String homepage;
    public String imdb_id;
    public List<BaseCompany> production_companies;
    public List<Country> production_countries;
    public Long revenue;
    public Integer runtime;
    public List<SpokenLanguage> spoken_languages;
    public Status status;
    public String tagline;

    // Following are used with append_to_response
    public AlternativeTitles alternative_titles;
    public Changes changes;
    public Keywords keywords;
    public ListResultsPage lists;
    public Images images;
    public Translations translations;
    public Credits credits;
    public MovieExternalIds external_ids;
    public ReleaseDatesResults release_dates;
    public MovieResultsPage similar;
    public MovieResultsPage recommendations;
    public ReviewResultsPage reviews;
    public Videos videos;

} public class MovieExternalIds {

    public Integer id;
    public String imdb_id;
    public String facebook_id;
    public String instagram_id;
    public String twitter_id;

} public class TmdbDate {

    // can not use ThreadLocal.withInitial as it requires Java 8
    private static final ThreadLocal<DateFormat> TMDB_DATE_FORMAT = new ThreadLocal<DateFormat>() {
        @Override
        public DateFormat initialValue() {
            return new SimpleDateFormat(TmdbHelper.TMDB_DATE_PATTERN);
        }
    };

    private final Date date;

    public TmdbDate(Date date) {
        this.date = date;
    }

    public TmdbDate(String date) {
        Date parsedDate;
        try {
            parsedDate = TMDB_DATE_FORMAT.get().parse(date);
        } catch (ParseException e) {
            parsedDate = null;
        }
        this.date = parsedDate;
    }

    @Override
    public String toString() {
        return TMDB_DATE_FORMAT.get().format(date);
    }

} public class Translations {

    public static class Translation {

        public String iso_3166_1;
        public String iso_639_1;
        public String name;
        public String english_name;
        public Data data;

        public static class Data {

            /**
             * Title for movies
             */
            public String title;
            /**
             * Title for tvshows/episodes
             */
            public String name;
            public String overview;
            public String homepage;
        }
    }

    public Integer id;
    public List<Translation> translations;
} public class Videos {

    public static class Video {

        public String id;
        public String iso_639_1;
        public String iso_3166_1;
        public String key;
        public String name;
        public String site;
        public Integer size;
        public VideoType type;

    }

    public Integer id;
    public List<Video> results;

} public class WatchProviders {

    public Integer id;
    /**
     * Mapped by ISO 3166-1 two letter country code, e.g. DE and US.
     */
    @Nonnull public Map<String, CountryInfo> results = new HashMap<>();

    public static class CountryInfo {

        /**
         * Link to this page to display all options and provide deep links to the actual providers (and to support
         * TMDB).
         */
        public String link;
        @Nonnull public java.util.List<WatchProvider> flatrate = new ArrayList<>();
        @Nonnull public java.util.List<WatchProvider> free = new ArrayList<>();
        @Nonnull public java.util.List<WatchProvider> ads = new ArrayList<>();
        @Nonnull public java.util.List<WatchProvider> buy = new ArrayList<>();

    }

    public static class WatchProvider {
        public Integer display_priority;
        public String logo_path;
        public Integer provider_id;
        public String provider_name;
    }

} public enum AppendToResponseItem {
    // Applies to Movies, TV Shows, TV Episodes, TV Seasons, People, Collections
    IMAGES("images"),

    // Applies to Movies, TV Shows, TV Episodes, TV Seasons, People
    CHANGES("changes"),

    // Applies to Movies, TV Shows, TV Episodes, TV Seasons
    CREDITS("credits"),
    VIDEOS("videos"),

    // Applies to Movies, TV Shows
    ALTERNATIVE_TITLES("alternative_titles"),
    KEYWORDS("keywords"),
    RECOMMENDATIONS("recommendations"),
    RELEASE_DATES("release_dates"),
    REVIEWS("reviews"),
    SIMILAR("similar"),
    TRANSLATIONS("translations"),

    // Applies to Movies
    LISTS("lists"),

    // Applies to Movies, TV Shows, TV Episodes, TV Seasons, People
    EXTERNAL_IDS("external_ids"),

    // Applies to TV Shows
    CONTENT_RATINGS("content_ratings"),

    // Applies to People
    MOVIE_CREDITS("movie_credits"),
    TV_CREDITS("tv_credits"),
    COMBINED_CREDITS("combined_credits"),
    TAGGED_IMAGES("tagged_images"),

    // Applies to Keywords, Companies
    MOVIES("movies");

    private final String value;

    AppendToResponseItem(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}
import static com.uwetrottmann.tmdb2.TestData.testMovie;
import static com.uwetrottmann.tmdb2.TestData.testMovieChangesEndDate;
import static com.uwetrottmann.tmdb2.TestData.testMovieChangesStartDate;
import static com.uwetrottmann.tmdb2.assertions.ChangeAssertions.assertContentChanges;
import static com.uwetrottmann.tmdb2.assertions.CreditAssertions.assertCredits;
import static com.uwetrottmann.tmdb2.assertions.GenericAssertions.assertAlternativeTitles;
import static com.uwetrottmann.tmdb2.assertions.GenericAssertions.assertImages;
import static com.uwetrottmann.tmdb2.assertions.GenericAssertions.assertTranslations;
import static com.uwetrottmann.tmdb2.assertions.GenericAssertions.assertVideos;
import static com.uwetrottmann.tmdb2.assertions.GenericAssertions.assertWatchProviderCountryInfo;
import static com.uwetrottmann.tmdb2.assertions.KeywordAssertions.assertKeywords;
import static com.uwetrottmann.tmdb2.assertions.ListAssertions.assertListResultsPage;
import static com.uwetrottmann.tmdb2.assertions.MovieAssertions.assertMovie;
import static com.uwetrottmann.tmdb2.assertions.MovieAssertions.assertMovieDataIntegrity;
import static com.uwetrottmann.tmdb2.assertions.MovieAssertions.assertMovieReleaseDates;
import static com.uwetrottmann.tmdb2.assertions.MovieAssertions.assertMovieResultsPage;
import static com.uwetrottmann.tmdb2.assertions.ReviewAssertions.assertReviews;
import static org.assertj.core.api.Assertions.assertThat;
import com.uwetrottmann.tmdb2.BaseTestCase;
import com.uwetrottmann.tmdb2.TestData;
import com.uwetrottmann.tmdb2.entities.AlternativeTitles;
import com.uwetrottmann.tmdb2.entities.AppendToResponse;
import com.uwetrottmann.tmdb2.entities.Changes;
import com.uwetrottmann.tmdb2.entities.Credits;
import com.uwetrottmann.tmdb2.entities.Images;
import com.uwetrottmann.tmdb2.entities.Keywords;
import com.uwetrottmann.tmdb2.entities.ListResultsPage;
import com.uwetrottmann.tmdb2.entities.Movie;
import com.uwetrottmann.tmdb2.entities.MovieExternalIds;
import com.uwetrottmann.tmdb2.entities.MovieResultsPage;
import com.uwetrottmann.tmdb2.entities.ReleaseDatesResults;
import com.uwetrottmann.tmdb2.entities.ReviewResultsPage;
import com.uwetrottmann.tmdb2.entities.TmdbDate;
import com.uwetrottmann.tmdb2.entities.Translations;
import com.uwetrottmann.tmdb2.entities.Videos;
import com.uwetrottmann.tmdb2.entities.WatchProviders;
import com.uwetrottmann.tmdb2.enumerations.AppendToResponseItem;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import retrofit2.Call;
package com.uwetrottmann.tmdb2.services;



public class MoviesServiceTest extends BaseTestCase {

    @Test
    public void test_summary() throws IOException {
        Call<Movie> call = getUnauthenticatedInstance().moviesService().summary(
                testMovie.id,
                "en"
        );

        Movie movie = call.execute().body();

        assertMovie(movie);
    }

    @Test
    public void test_summary_language() throws IOException {
        Call<Movie> call = getUnauthenticatedInstance().moviesService().summary(
                testMovie.id,
                "pt-BR"
        );

        Movie movie = call.execute().body();

        assertMovie(movie);
        assertThat(movie).isNotNull();
        assertThat(movie.title).isNotEmpty();
    }


    @Test
    public void test_summary_append_all() throws IOException {

        HashMap<String, String> opts = new HashMap<>();
        opts.put("start_date", new TmdbDate(testMovieChangesStartDate).toString());
        opts.put("end_date", new TmdbDate(testMovieChangesEndDate).toString());

        Call<Movie> call = getUnauthenticatedInstance().moviesService().summary(
                testMovie.id,
                "en",
                new AppendToResponse(
                        AppendToResponseItem.RELEASE_DATES,
                        AppendToResponseItem.CREDITS,
                        AppendToResponseItem.VIDEOS,
                        AppendToResponseItem.ALTERNATIVE_TITLES,
                        AppendToResponseItem.SIMILAR,
                        AppendToResponseItem.CHANGES,
                        AppendToResponseItem.TRANSLATIONS,
                        AppendToResponseItem.IMAGES,
                        AppendToResponseItem.RECOMMENDATIONS,
                        AppendToResponseItem.REVIEWS,
                        AppendToResponseItem.LISTS,
                        AppendToResponseItem.KEYWORDS
                ),
                opts
        );

        Movie movie = call.execute().body();

        assertMovieDataIntegrity(movie);

        //Release Dates Assertions
        assertMovieReleaseDates(movie.release_dates);

        //Credits Assertions
        assertCredits(movie.credits);

        //Videos Assertions
        assertVideos(movie.videos);

        //Similar Movies Assertions
        assertMovieResultsPage(movie.similar);