/// <summary>
        /// Inserts or updates a person.
        /// </summary>
        /// <param name="person">The person to persist.</param>
        public void SaveOrUpdate(Person person)
        {
            if (person == null)
                throw new ArgumentNullException("person");

            CurrentSession.SaveOrUpdate(person);
        }
        public void ShouldRetrieveInsertedPersonAfterInsert()
        {
            var person = new Person { FirstName = "steve", LastName = "blah" };
            _sut.SaveOrUpdate(person);

            var retrieved = InMemorySession.Query<Person>().ToArray();
            Assert.AreEqual(retrieved.Length, 1);
            Assert.AreEqual(retrieved.First().FirstName, person.FirstName);
        }
        public void ShouldRetrievePreviouslyInsertedPersonsOnGetAll()
        {
            var person = new Person { FirstName = "steve", LastName = "blah" };
            using (var transaction = InMemorySession.BeginTransaction())
            {
                InMemorySession.Save(person);
                transaction.Commit();
            }

            var retrieved = _sut.GetAll().ToArray();
            Assert.AreEqual(retrieved.Length, 1);
            Assert.AreEqual(retrieved.First().FirstName, person.FirstName);
        }
        public void ShouldUpdateNotInsertOnSaveOrUpdate()
        {
            var person = new Person {FirstName = "steve", LastName = "blah"};
            using (var transaction = InMemorySession.BeginTransaction())
            {
                InMemorySession.Save(person);
                transaction.Commit();
            }

            var retrieved = InMemorySession.Query<Person>().First();
            retrieved.FirstName = "john";

            using (var transaction = InMemorySession.BeginTransaction())
            {
                _sut.SaveOrUpdate(retrieved);
                transaction.Commit();
            }

            Assert.AreEqual(1, InMemorySession.Query<Person>().Count());
            Assert.AreEqual(retrieved.FirstName, InMemorySession.Query<Person>().First().FirstName);
        }
        /// <summary>
        /// Adapts retrieved detailed movie information into a useable movie object.
        /// </summary>
        /// <param name="info">The retrieved information.</param>
        /// <returns>The adapted information.</returns>
        private Movie AdaptDetails(dynamic info)
        {
            var data = info[0];
            var year = new DateTime(Convert.ToInt32(data["released"].Substring(0, 4)), 1, 1);
            var movie = new Movie
            {
                DateAdded = DateTime.Now,
                Description = data["overview"],
                Name = data["name"],
                PosterLocation = DerivePoster(data),
                Genres = DeriveGenres(data),
                Year = year
            };

            var cast = data["cast"];
            var actors = new List<Person>();
            var producers = new List<Person>();
            foreach (IDictionary<string, object> member in cast)
            {
                var person = _personRepository.GetByName(member["name"] as string);
                if (person == null)
                {
                    person = new Person {FirstName = ((string) member["name"]).Split(' ')[0], LastName = ((string) member["name"]).Split(' ')[1]};
                    _personRepository.SaveOrUpdate(person);
                }

                switch ((string)member["job"])
                {
                    case "Director":
                        movie.Director = person;
                        break;
                    case "Producer":
                        producers.Add(person);
                        break;
                    case "Actor":
                        actors.Add(person);
                        break;
                }
            }

            movie.Producers = producers;
            movie.Actors = actors;

            return movie;
        }