blob: 23365a568b2a6c33f019ca40c9c69b420b3af536 [file] [log] [blame]
//
// BKJSONControllerTests.m
// Broker
//
// Created by Andrew Smith on 10/24/13.
// Copyright (c) 2013 Andrew B. Smith. All rights reserved.
//
#import "BKTestCase.h"
#import <Broker/Broker.h>
#import "Employee.h"
#import "BrokerTestsHelpers.h"
@interface BKJSONControllerTests : BKTestCase
@property (nonatomic, strong) BKJSONController *jsonController;
@property (nonatomic, strong) BKEntityMap *entityMap;
@end
@implementation BKJSONControllerTests
- (void)setUp
{
[super setUp];
self.entityMap = [BKEntityMap entityMap];
BKJSONController *jsonController = [BKJSONController JSONControllerWithContext:self.testStore.managedObjectContext
entityMap:self.entityMap];
self.jsonController = jsonController;
}
- (void)tearDown
{
self.entityMap = nil;
self.jsonController = nil;
[super tearDown];
}
- (void)registerEntities
{
[self.entityMap registerEntityNamed:kDepartment
withPrimaryKey:kDepartmentPrimaryKey
andMapNetworkProperties:nil
toLocalProperties:nil
inContext:self.testStore.managedObjectContext];
[self.entityMap registerEntityNamed:kEmployee
withPrimaryKey:kEmployeePrimaryKey
andMapNetworkProperties:nil
toLocalProperties:nil
inContext:self.testStore.managedObjectContext];
[self.entityMap registerEntityNamed:@"ContactInfo"
withPrimaryKey:nil
andMapNetworkProperties:nil
toLocalProperties:nil
inContext:self.testStore.managedObjectContext];
}
#pragma mark - Tests
- (void)testFlatJSON
{
[self registerEntities];
id json = JsonFromFile(@"department_flat.json");
[self.jsonController processJSONObject:json
asEntityNamed:kDepartment];
NSArray *allDepartments = [BrokerTestsHelpers findAllEntitiesNamed:kDepartment
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allDepartments.count, 1U, @"Should have one department");
NSManagedObject *department = [allDepartments firstObject];
XCTAssertEqualObjects([department valueForKey:kDepartmentPrimaryKey],
@(1234), @"Department should have the correct primary key");
XCTAssertEqualObjects([department valueForKey:kName],
@"Engineering", @"Department should have the correct primary key");
}
- (void)testFlatJSONOnNSManagedObject
{
[self registerEntities];
NSManagedObject *department = [BrokerTestsHelpers createNewDepartment:self.testStore.managedObjectContext];
id json = JsonFromFile(@"department_flat.json");
[self.jsonController processJSONObject:json
onObject:department];
XCTAssertEqualObjects([department valueForKey:kDepartmentPrimaryKey],
@(1234), @"Department should have the correct primary key");
XCTAssertEqualObjects([department valueForKey:kName],
@"Engineering", @"Department should have the correct primary key");
}
- (void)testEmployeeCollectionJson
{
[self registerEntities];
id json = JsonFromFile(@"department_employees_100.json");
[self.jsonController processJSONCollection:json
asEntitiesNamed:kEmployee];
NSArray *employees = [BrokerTestsHelpers findAllEntitiesNamed:kEmployee
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(employees.count, 100U, @"Should have the right amount of employee objects");
}
- (void)testNoPrimaryKey
{
//
// Without a primary key, we should end up with duplicat objects. Test this
// by processing the same JSON twice.
//
[self.entityMap registerEntityNamed:kEmployee
withPrimaryKey:nil
andMapNetworkProperties:nil
toLocalProperties:nil
inContext:self.testStore.managedObjectContext];
id json = JsonFromFile(@"department_employees.json");
[self.jsonController processJSONCollection:json
asEntitiesNamed:kEmployee];
NSArray *allEmployees = [BrokerTestsHelpers findAllEntitiesNamed:kEmployee
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allEmployees.count, 6U, @"Should have the right number of employees");
[self.jsonController processJSONCollection:json
asEntitiesNamed:kEmployee];
allEmployees = [BrokerTestsHelpers findAllEntitiesNamed:kEmployee
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allEmployees.count, 12U, @"Should have the right number of employees");
}
- (void)testNestedJSON
{
[self registerEntities];
id json = JsonFromFile(@"department_nested.json");
[self.jsonController processJSONObject:json
asEntityNamed:kDepartment];
NSArray *allDepartments = [BrokerTestsHelpers findAllEntitiesNamed:kDepartment
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allDepartments.count, 1U, @"Should have one department");
NSManagedObject *department = [allDepartments firstObject];
XCTAssertEqualObjects([department valueForKey:kDepartmentPrimaryKey],
@(1234), @"Department should have the correct primary key");
XCTAssertEqualObjects([department valueForKey:kName],
@"Engineering", @"Department should have the correct primary key");
NSArray *employees = [department valueForKey:kEmployees];
XCTAssertEqual(employees.count, 6U, @"Department should have the right amount of employees");
}
- (void)testDepartmentEmployeesRelationshipJSON
{
[self registerEntities];
id json = JsonFromFile(@"department_employees_100.json");
// Build Deparment
NSManagedObject *department = [BrokerTestsHelpers createNewDepartment:self.testStore.managedObjectContext];
[self.jsonController processJSON:json
forRelationship:kEmployees
onObject:department];
NSSet *employees = (NSSet *)[department valueForKey:kEmployees];
XCTAssertEqual(employees.count, 100U, @"Should have the right amount of employee objects");
}
- (void)testFlatEmployeeWithNetworkPropertyJSONProcessing
{
[self.entityMap registerEntityNamed:kEmployee
withPrimaryKey:kEmployeePrimaryKey
andMapNetworkProperties:@[@"id"]
toLocalProperties:@[kEmployeePrimaryKey]
inContext:self.testStore.managedObjectContext];
id json = JsonFromFile(@"employee_network_property.json");
[self.jsonController processJSONObject:json
asEntityNamed:kEmployee];
NSArray *allEmployees = [BrokerTestsHelpers findAllEntitiesNamed:kEmployee
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allEmployees.count, 1U, @"Should have one employee");
Employee *employee = [allEmployees firstObject];
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// [formatter setDateFormat:kEmployeeStartDateFormat];
// NSDate *date = [formatter dateFromString:@"2011/10/06 00:51:10 -0700"];
XCTAssertEqualObjects([employee valueForKey:@"firstname"], @"Andrew", @"Attributes should be set correctly");
XCTAssertEqualObjects([employee valueForKey:@"lastname"], @"Smith", @"Attributes should be set correctly");
XCTAssertEqualObjects([employee valueForKey:kEmployeePrimaryKey], @5678, @"Attributes should be set correctly");
// STAssertEqualObjects([employee valueForKey:@"startDate"], date, @"Attributes should be set correctly");
}
- (void)testEmployeeWithContactInfo
{
[self registerEntities];
id json = JsonFromFile(@"employee_nested.json");
[self.jsonController processJSONObject:json
asEntityNamed:kEmployee];
NSArray *allEmployees = [BrokerTestsHelpers findAllEntitiesNamed:kEmployee
inContext:self.testStore.managedObjectContext];
XCTAssertEqual(allEmployees.count, 1U, @"Should have one employee");
Employee *employee = [allEmployees firstObject];
XCTAssertNotNil(employee.contactInfo, @"Should have contact info");
}
- (void)testNilJSON
{
[self registerEntities];
NSManagedObject *object = [self.jsonController processJSONObject:nil
asEntityNamed:kEmployee];
XCTAssertNil(object);
}
- (void)testNilEntity
{
[self registerEntities];
id json = JsonFromFile(@"employee_nested.json");
NSManagedObject *object = [self.jsonController processJSONObject:json
asEntityNamed:nil];
XCTAssertNil(object);
}
- (void)testMalformedJSON
{
[self registerEntities];
id json = @"not json";
XCTAssertThrows([self.jsonController processJSONObject:json asEntityNamed:kEmployee],
@"Processing unexpected JSON should throw.");
}
- (void)testWrongJson
{
[self registerEntities];
id json = JsonFromFile(@"department_nested.json");
XCTAssertNoThrow([self.jsonController processJSONObject:json asEntityNamed:kEmployee],
@"Processing unexpected JSON should not crash");
}
- (void)testEmployeeWithNullValue
{
[self registerEntities];
Employee *employee = (Employee *)[BrokerTestsHelpers createNewFilledOutEmployee:self.testStore.managedObjectContext];
employee.employeeID = @(5678);
id json = JsonFromFile(@"employee_null_value.json");
[self.jsonController processJSONObject:json
asEntityNamed:kEmployee];
XCTAssertNil(employee.lastname, @"Last name should be nil when a NULL is present in the JSON");
}
- (void)testEmpoloyeeWithTransformableDictionary
{
[self registerEntities];
id json = JsonFromFile(@"employee_flat_dict.json");
NSManagedObject *employee = [self.jsonController processJSONObject:json
asEntityNamed:kEmployee];
XCTAssertEqualObjects([employee valueForKey:@"json"], json[@"json"]);
}
- (void)testEmpoloyeeWithTransformableArray
{
[self registerEntities];
id json = JsonFromFile(@"employee_flat_list.json");
NSManagedObject *employee = [self.jsonController processJSONObject:json
asEntityNamed:kEmployee];
XCTAssertEqualObjects([employee valueForKey:@"json"], json[@"json"]);
}
@end