//
//  SMStoreControllerTests.m
//  StoreMad
//
//  Created by Andrew Smith on 10/15/13.
//  Copyright (c) 2013 eGraphs. All rights reserved.
//

#import <XCTest/XCTest.h>
#import "StoreMadBaseTest.h"

#import "Employee.h"

@interface SMStoreControllerTests : StoreMadBaseTest

@end

@implementation SMStoreControllerTests

- (void)setUp
{
    [super setUp];
    // Put setup code here; it will be run once, before the first test case.
}

- (void)tearDown
{
    // Put teardown code here; it will be run once, after the last test case.
    [super tearDown];
}

- (void)testDeleteStore
{
    [self.storeController.managedObjectContext stm_save];
    
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];

    XCTAssertTrue(exists, @"Store should exist at URL before delete store");
    
    [self.storeController deleteStore];
    
    exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];

    XCTAssertFalse(exists, @"Store should not exist at URL after delete store");
}

- (void)testResetStore
{
    [Employee stm_createInContext:self.testContext];
    [self.storeController.managedObjectContext stm_save];
    
    NSError *error;
    BOOL reset = [self.storeController resetStore:&error];
    XCTAssertTrue(reset, @"Store should be reset");
    
    
    NSFetchRequest *employeeFetch = [self.testContext stm_fetchRequestForObjectClass:[Employee class]];
    NSArray *fetchedEmployees = [self.testContext stm_executeFetchRequest:employeeFetch];

    XCTAssertNil(error, @"Should not have an error after reset");
    XCTAssertEqual(fetchedEmployees.count, 0, @"Should not have any employees after a reset");
    
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[self.storeController.storeURL path]];
    XCTAssertTrue(exists, @"Store should exist at URL after reset");
}

- (void)testResetStoreSendsNotification {
	[self expectationForNotification:kSMStoreControllerDidReset
	                          object:self.storeController
	                         handler:nil];
    
    BOOL reset = [self.storeController resetStore:nil];
    XCTAssertTrue(reset, @"Store should be reset");
    
    [self waitForExpectationsWithTimeout:1.0
                                 handler:nil];
}

- (void)testResetStoreShouldHaveSameManagedObjectContext
{
    [Employee stm_createInContext:self.testContext];
    [self.storeController.managedObjectContext stm_save];
    
    NSManagedObjectContext *context = self.storeController.managedObjectContext;
    
    NSError *error;
    [self.storeController resetStore:&error];

    XCTAssertEqualObjects(context,
                          self.storeController.managedObjectContext,
                          @"Should have the same managed object context after reset");
}

@end
