Skip to content

Commit

Permalink
Change a bit about how account callbacks work and implement login.
Browse files Browse the repository at this point in the history
  • Loading branch information
marcweil committed Mar 2, 2012
1 parent e726cb2 commit cd9ea11
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 14 deletions.
2 changes: 2 additions & 0 deletions ios/cloudmine-ios.xcodeproj/project.pbxproj
Expand Up @@ -67,6 +67,7 @@
7A308A4C14799471008ADD3C /* libKiwi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A308A4B14799471008ADD3C /* libKiwi.a */; };
7A4A6F2914FFF08100B95D13 /* CMUserSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A4A6F2814FFF08100B95D13 /* CMUserSpec.m */; };
7A4A6F2C14FFF3CF00B95D13 /* CMUserAccountResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A4A6F2B14FFF3CF00B95D13 /* CMUserAccountResult.h */; };
7A4A6FB91500474500B95D13 /* CMUserAccountResult.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7A4A6F2B14FFF3CF00B95D13 /* CMUserAccountResult.h */; };
7A58CC2114F1B544003E864B /* CMMimeType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A58CC1F14F1B544003E864B /* CMMimeType.h */; };
7A58CC2214F1B544003E864B /* CMMimeType.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A58CC2014F1B544003E864B /* CMMimeType.m */; };
7A58CC2314F1B54E003E864B /* CMMimeType.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7A58CC1F14F1B544003E864B /* CMMimeType.h */; };
Expand Down Expand Up @@ -176,6 +177,7 @@
dstPath = "${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal/${PRODUCT_NAME}.framework/Versions/A/Headers/";
dstSubfolderSpec = 0;
files = (
7A4A6FB91500474500B95D13 /* CMUserAccountResult.h in CopyFiles */,
7AE355D714F1B896006AF903 /* CMFileUploadResult.h in CopyFiles */,
7A58CC2314F1B54E003E864B /* CMMimeType.h in CopyFiles */,
7AA79DDD14DC5E4D00F3CA3B /* CloudMine.h in CopyFiles */,
Expand Down
1 change: 1 addition & 0 deletions ios/ios/src/CloudMine.h
Expand Up @@ -24,4 +24,5 @@
#import "CMStoreCallbacks.h"
#import "CMStoreOptions.h"
#import "CMUser.h"
#import "CMUserAccountResult.h"
#import "CMWebService.h"
2 changes: 1 addition & 1 deletion ios/ios/src/Web Services/CMWebService.h
Expand Up @@ -55,7 +55,7 @@ typedef void (^CMWebServiceFileUploadSuccessCallback)(CMFileUploadResult result)
*/
typedef void (^CMWebServiceFileFetchSuccessCallback)(NSData *data, NSString *contentType);

typedef void (^CMWebServiceUserAccountOperationCallback)(CMUserAccountResult result, NSArray *messages);
typedef void (^CMWebServiceUserAccountOperationCallback)(CMUserAccountResult result, NSDictionary *responseBody);

/**
* Base class for all classes concerned with the communication between the client device and the CloudMine
Expand Down
26 changes: 20 additions & 6 deletions ios/ios/src/Web Services/CMWebService.m
Expand Up @@ -215,7 +215,20 @@ - (void)deleteValuesForKeys:(NSArray *)keys
#pragma mark - User account management

- (void)loginUser:(CMUser *)user callback:(CMWebServiceUserAccountOperationCallback)callback {
NSURL *url = [NSURL URLWithString:[CM_BASE_URL stringByAppendingFormat:@"/app/%@/account/login", _appIdentifier]];
ASIHTTPRequest *request = [self constructHTTPRequestWithVerb:@"POST" URL:url appSecret:_appSecret binaryData:NO user:nil];
request.username = user.userId;
request.password = user.password;

[self executeUserAccountRequest:request codeMapper:^CMUserAccountResult(NSUInteger httpResponseCode) {
switch (httpResponseCode) {
case 200:
return CMUserAccountLoginSucceeded;
default:
return CMUserAccountUnknownResult;
}
}
callback:callback];
}

- (void)logoutUser:(CMUser *)user callback:(CMWebServiceUserAccountOperationCallback)callback {
Expand All @@ -225,8 +238,9 @@ - (void)logoutUser:(CMUser *)user callback:(CMWebServiceUserAccountOperationCall
- (void)createAccountWithUser:(CMUser *)user callback:(CMWebServiceUserAccountOperationCallback)callback {
NSURL *url = [NSURL URLWithString:[CM_BASE_URL stringByAppendingFormat:@"/app/%@/account/create", _appIdentifier]];
ASIHTTPRequest *request = [self constructHTTPRequestWithVerb:@"POST" URL:url appSecret:_appSecret binaryData:NO user:nil];
request.username = user.userId;
request.password = user.password;

NSDictionary *payload = [NSDictionary dictionaryWithObjectsAndKeys:user.userId, @"email", user.password, @"password", nil];
request.postBody = [[[payload yajl_JSONString] dataUsingEncoding:NSUTF8StringEncoding] mutableCopy];

[self executeUserAccountRequest:request codeMapper:^CMUserAccountResult(NSUInteger httpResponseCode) {
switch (httpResponseCode) {
Expand Down Expand Up @@ -265,14 +279,14 @@ - (void)executeUserAccountRequest:(ASIHTTPRequest *)request
NSLog(@"Unexpected response received from server during user account creation. Code %d, body: %@.", blockRequest.responseStatusCode, blockRequest.responseString);
}

NSArray *messages = nil;
NSDictionary *responseBody = nil;
if (blockRequest.responseString == nil || blockRequest.responseString.length == 0) {
messages = [[blockRequest.responseString yajl_JSON] objectForKey:@"errors"];
responseBody = [blockRequest.responseString yajl_JSON];
} else {
messages = [NSArray array];
responseBody = [NSDictionary dictionary];
}

callback(resultCode, messages);
callback(resultCode, responseBody);
};

[request setCompletionBlock:responseBlock];
Expand Down
38 changes: 31 additions & 7 deletions ios/iosTests/CMWebServiceSpec.m
Expand Up @@ -635,28 +635,28 @@
it(@"constructs account creation URL correctly", ^{
NSURL *expectedUrl = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.cloudmine.me/v1/app/%@/account/create", appId]];
CMUser *user = [[CMUser alloc] initWithUserId:@"test@domain.com" andPassword:@"pass"];

id spy = [[CMBlockValidationMessageSpy alloc] init];
[spy addValidationBlock:^(NSInvocation *invocation) {
ASIHTTPRequest *request = nil;
[invocation getArgument:&request atIndex:2]; // only arg is the request
[[request.url should] equal:expectedUrl];
[[request.requestMethod should] equal:@"POST"];
[[request.username should] equal:user.userId];
[[request.password should] equal:user.password];
[request.username shouldBeNil];
[request.password shouldBeNil];
[[[[request requestHeaders] objectForKey:@"X-CloudMine-ApiKey"] should] equal:appSecret];
[[[request requestHeaders] objectForKey:@"X-CloudMine-LoginToken"] shouldBeNil];
} forSelector:@selector(addOperation:)];

// Validate the request when it's pushed onto the network queue so
// we don't interfere with the construction and use of the request
// otherwise throughout the production code.
[service.networkQueue addMessageSpy:spy forMessagePattern:[KWMessagePattern messagePatternWithSelector:@selector(addOperation:)]];

[[service.networkQueue should] receive:@selector(addOperation:)];
[[service.networkQueue should] receive:@selector(go)];
[service createAccountWithUser:user callback:^(CMUserAccountResult result, NSArray *messages) {

[service createAccountWithUser:user callback:^(CMUserAccountResult result, NSDictionary *responseBody) {
}];
});

Expand All @@ -669,7 +669,31 @@
});

it(@"constructs login URL correctly", ^{
NSURL *expectedUrl = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.cloudmine.me/v1/app/%@/account/login", appId]];
CMUser *user = [[CMUser alloc] initWithUserId:@"test@domain.com" andPassword:@"pass"];

id spy = [[CMBlockValidationMessageSpy alloc] init];
[spy addValidationBlock:^(NSInvocation *invocation) {
ASIHTTPRequest *request = nil;
[invocation getArgument:&request atIndex:2]; // only arg is the request
[[request.url should] equal:expectedUrl];
[[request.requestMethod should] equal:@"POST"];
[[request.username should] equal:user.userId];
[[request.password should] equal:user.password];
[[[[request requestHeaders] objectForKey:@"X-CloudMine-ApiKey"] should] equal:appSecret];
[[[request requestHeaders] objectForKey:@"X-CloudMine-LoginToken"] shouldBeNil];
} forSelector:@selector(addOperation:)];

// Validate the request when it's pushed onto the network queue so
// we don't interfere with the construction and use of the request
// otherwise throughout the production code.
[service.networkQueue addMessageSpy:spy forMessagePattern:[KWMessagePattern messagePatternWithSelector:@selector(addOperation:)]];

[[service.networkQueue should] receive:@selector(addOperation:)];
[[service.networkQueue should] receive:@selector(go)];

[service loginUser:user callback:^(CMUserAccountResult result, NSDictionary *responseBody) {
}];
});

it(@"constructs logout URL correctly", ^{
Expand Down

0 comments on commit cd9ea11

Please sign in to comment.