-
Notifications
You must be signed in to change notification settings - Fork 280
/
GTRepository+StatusSpec.m
132 lines (110 loc) · 5.63 KB
/
GTRepository+StatusSpec.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//
// GTRepository+StatusSpec
// ObjectiveGitFramework
//
// Created by Danny Greg on 2013-08-08.
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
//
@import ObjectiveGit;
@import Nimble;
@import Quick;
#import "QuickSpec+GTFixtures.h"
QuickSpecBegin(GTRepositoryStatus)
describe(@"Checking status", ^{
__block GTRepository *repository = nil;
__block NSURL *targetFileURL = nil;
__block NSError *err;
NSData *testData = [@"test" dataUsingEncoding:NSUTF8StringEncoding];
beforeEach(^{
repository = self.testAppFixtureRepository;
targetFileURL = [repository.fileURL URLByAppendingPathComponent:@"main.m"];
expect(repository).notTo(beNil());
});
void (^updateIndexForSubpathAndExpectStatus)(NSString *, GTDeltaType) = ^(NSString *subpath, GTDeltaType expectedIndexStatus) {
__block NSError *err = nil;
GTIndex *index = [repository indexWithError:&err];
expect(err).to(beNil());
expect(index).notTo(beNil());
expect(@([index updatePathspecs:NULL error:NULL passingTest:NULL])).to(beTruthy());
NSDictionary *renamedOptions = @{ GTRepositoryStatusOptionsFlagsKey: @(GTRepositoryStatusFlagsIncludeIgnored | GTRepositoryStatusFlagsIncludeUntracked | GTRepositoryStatusFlagsRecurseUntrackedDirectories | GTRepositoryStatusFlagsRenamesHeadToIndex) };
expect(@([repository enumerateFileStatusWithOptions:renamedOptions error:&err usingBlock:^(GTStatusDelta *headToIndex, GTStatusDelta *indexToWorkingDirectory, BOOL *stop) {
if (![headToIndex.newFile.path isEqualToString:subpath]) return;
expect(@(headToIndex.status)).to(equal(@(expectedIndexStatus)));
}])).to(beTruthy());
expect(err).to(beNil());
};
void (^expectSubpathToHaveWorkDirStatus)(NSString *, GTDeltaType) = ^(NSString *subpath, GTDeltaType expectedWorkDirStatus) {
__block NSError *err = nil;
NSDictionary *renamedOptions = @{ GTRepositoryStatusOptionsFlagsKey: @(GTRepositoryStatusFlagsIncludeIgnored | GTRepositoryStatusFlagsIncludeUntracked | GTRepositoryStatusFlagsRecurseUntrackedDirectories | GTRepositoryStatusFlagsRenamesIndexToWorkingDirectory) };
expect(@([repository enumerateFileStatusWithOptions:renamedOptions error:&err usingBlock:^(GTStatusDelta *headToIndex, GTStatusDelta *indexToWorkingDirectory, BOOL *stop) {
if (![indexToWorkingDirectory.newFile.path isEqualToString:subpath]) return;
expect(@(indexToWorkingDirectory.status)).to(equal(@(expectedWorkDirStatus)));
}])).to(beTruthy());
expect(err).to(beNil());
};
void (^expectSubpathToHaveMatchingStatus)(NSString *, GTDeltaType) = ^(NSString *subpath, GTDeltaType status) {
expectSubpathToHaveWorkDirStatus(subpath, status);
updateIndexForSubpathAndExpectStatus(subpath, status);
};
it(@"should recognize untracked files", ^{
expectSubpathToHaveWorkDirStatus(@"UntrackedImage.png", GTDeltaTypeUntracked);
});
it(@"should recognize added files", ^{
updateIndexForSubpathAndExpectStatus(@"UntrackedImage.png", GTDeltaTypeAdded);
});
it(@"should recognize modified files", ^{
expect(@([NSFileManager.defaultManager removeItemAtURL:targetFileURL error:&err])).to(beTruthy());
expect(err).to(beNil());
expect(@([testData writeToURL:targetFileURL atomically:YES])).to(beTruthy());
expectSubpathToHaveMatchingStatus(targetFileURL.lastPathComponent, GTDeltaTypeModified);
});
it(@"should recognize copied files", ^{
NSURL *copyLocation = [repository.fileURL URLByAppendingPathComponent:@"main2.m"];
expect(@([NSFileManager.defaultManager copyItemAtURL:targetFileURL toURL:copyLocation error:&err])).to(beTruthy());
expect(err).to(beNil());
updateIndexForSubpathAndExpectStatus(copyLocation.lastPathComponent, GTDeltaTypeCopied);
});
it(@"should recognize deleted files", ^{
expect(@([NSFileManager.defaultManager removeItemAtURL:targetFileURL error:&err])).to(beTruthy());
expect(err).to(beNil());
expectSubpathToHaveMatchingStatus(targetFileURL.lastPathComponent, GTDeltaTypeDeleted);
});
it(@"should recognize renamed files", ^{
NSURL *moveLocation = [repository.fileURL URLByAppendingPathComponent:@"main-moved.m"];
expect(@([NSFileManager.defaultManager moveItemAtURL:targetFileURL toURL:moveLocation error:&err])).to(beTruthy());
expect(err).to(beNil());
expectSubpathToHaveWorkDirStatus(moveLocation.lastPathComponent, GTDeltaTypeRenamed);
});
it(@"should recognise ignored files", ^{ //at least in the default options
expectSubpathToHaveWorkDirStatus(@".DS_Store", GTDeltaTypeIgnored);
});
it(@"should skip ignored files if asked", ^{
__block NSError *err = nil;
NSDictionary *options = @{ GTRepositoryStatusOptionsFlagsKey: @(0) };
BOOL enumerationSuccessful = [repository enumerateFileStatusWithOptions:options error:&err usingBlock:^(GTStatusDelta *headToIndex, GTStatusDelta *indexToWorkingDirectory, BOOL *stop) {
expect(@(indexToWorkingDirectory.status)).notTo(equal(@(GTDeltaTypeIgnored)));
}];
expect(@(enumerationSuccessful)).to(beTruthy());
expect(err).to(beNil());
});
it(@"should report file should be ignored", ^{
__block NSError *err = nil;
NSURL *fileURL = [repository.fileURL URLByAppendingPathComponent:@".DS_Store"];
BOOL success = NO;
BOOL shouldIgnore = [repository shouldFileBeIgnored:fileURL success:&success error:&err];
expect(@(success)).to(beTrue());
expect(@(shouldIgnore)).to(beTrue());
expect(err).to(beNil());
});
it(@"should report file should be ignored (convenience wrapper)", ^{
__block NSError *err = nil;
NSURL *fileURL = [repository.fileURL URLByAppendingPathComponent:@".DS_Store"];
GTFileIgnoreState ignore = [repository shouldIgnoreFileURL:fileURL error:&err];
expect(@(ignore)).to(equal(@(GTFileIgnoreStateShouldIgnore)));
expect(err).to(beNil());
});
});
afterEach(^{
[self tearDown];
});
QuickSpecEnd