| 
1 | 1 | # Helper indices for commits:  | 
2 |  | -#   git_repo.commits[0] => 'add railties dir' (initial commit)  | 
3 |  | -#   git_repo.commits[1] => 'commit1'  | 
4 |  | -#   git_repo.commits.last => 'commit2'  | 
 | 2 | +#   @git_repo.commits[0] => 'add railties dir' (initial commit)  | 
 | 3 | +#   @git_repo.commits[1] => 'commit1'  | 
 | 4 | +#   @git_repo.commits.last => 'commit2'  | 
5 | 5 | 
 
  | 
6 | 6 | require "rails/diff/rails_repo"  | 
7 | 7 | require "fileutils"  | 
 | 
11 | 11 |   let(:logger) { spy }  | 
12 | 12 |   let(:cache_dir) { Dir.mktmpdir }  | 
13 | 13 |   let(:rails_path) { File.join(cache_dir, "rails") }  | 
14 |  | -  let(:git_repo) do  | 
15 |  | -    GitRepo.new.tap do |repo|  | 
 | 14 | + | 
 | 15 | +  before(:all) do  | 
 | 16 | +    @git_repo = GitRepo.new.tap do |repo|  | 
16 | 17 |       repo.add_commit("commit1")  | 
17 | 18 |       repo.add_commit("commit2")  | 
18 | 19 |     end  | 
19 | 20 |   end  | 
20 | 21 | 
 
  | 
21 | 22 |   after do  | 
22 | 23 |     FileUtils.rm_rf(cache_dir)  | 
23 |  | -    git_repo.cleanup  | 
 | 24 | +    @git_repo.cleanup  | 
24 | 25 |   end  | 
25 | 26 | 
 
  | 
26 | 27 |   describe "#up_to_date?" do  | 
27 | 28 |     it "returns false when repo is not cloned yet" do  | 
28 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 29 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
29 | 30 | 
 
  | 
30 | 31 |       result = repo.up_to_date?  | 
31 | 32 | 
 
  | 
32 | 33 |       expect(result).to eq false  | 
33 | 34 |     end  | 
34 | 35 | 
 
  | 
35 | 36 |     it "returns true when repo is on the latest commit" do  | 
36 |  | -      git_repo.clone_at_commit(git_repo.commits.last, rails_path)  | 
37 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 37 | +      @git_repo.clone_at_commit(@git_repo.commits.last, rails_path)  | 
 | 38 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
38 | 39 | 
 
  | 
39 | 40 |       result = repo.up_to_date?  | 
40 | 41 | 
 
  | 
41 | 42 |       expect(result).to eq true  | 
42 | 43 |     end  | 
43 | 44 | 
 
  | 
44 | 45 |     it "returns false and removes the repo when repo is on an old commit" do  | 
45 |  | -      git_repo.clone_at_commit(git_repo.commits.first, rails_path)  | 
46 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 46 | +      @git_repo.clone_at_commit(@git_repo.commits.first, rails_path)  | 
 | 47 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
47 | 48 | 
 
  | 
48 | 49 |       result = repo.up_to_date?  | 
49 | 50 | 
 
  | 
 | 
54 | 55 | 
 
  | 
55 | 56 |   describe "#latest_commit" do  | 
56 | 57 |     it "returns the latest commit SHA from the remote repo" do  | 
57 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 58 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
58 | 59 | 
 
  | 
59 | 60 |       latest = repo.latest_commit  | 
60 | 61 | 
 
  | 
61 |  | -      expect(latest).to eq git_repo.commits.last  | 
 | 62 | +      expect(latest).to eq @git_repo.commits.last  | 
62 | 63 |     end  | 
63 | 64 | 
 
  | 
64 | 65 |     it "returns the new latest commit after a new commit is pushed" do  | 
65 |  | -      new_commit = git_repo.add_commit("commit3")  | 
66 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 66 | +      new_commit = @git_repo.add_commit("commit3")  | 
 | 67 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
67 | 68 | 
 
  | 
68 | 69 |       latest = repo.latest_commit  | 
69 | 70 | 
 
  | 
 | 
73 | 74 | 
 
  | 
74 | 75 |   describe "#checkout" do  | 
75 | 76 |     it "checks out the given commit in the repo" do  | 
76 |  | -      git_repo.clone_at_commit(git_repo.commits.last, rails_path)  | 
77 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 77 | +      @git_repo.clone_at_commit(@git_repo.commits.last, rails_path)  | 
 | 78 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
78 | 79 | 
 
  | 
79 | 80 |       # Checkout the first file commit (not the initial railties commit)  | 
80 |  | -      repo.checkout(git_repo.commits[1])  | 
 | 81 | +      repo.checkout(@git_repo.commits[1])  | 
81 | 82 | 
 
  | 
82 | 83 |       # Verify HEAD is now at the first file commit  | 
83 | 84 |       current = Dir.chdir(rails_path) { `git rev-parse HEAD`.strip }  | 
84 |  | -      expect(current).to eq git_repo.commits[1]  | 
 | 85 | +      expect(current).to eq @git_repo.commits[1]  | 
85 | 86 |     end  | 
86 | 87 | 
 
  | 
87 | 88 |     it "logs the checkout info message" do  | 
88 |  | -      git_repo.clone_at_commit(git_repo.commits.last, rails_path)  | 
89 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 89 | +      @git_repo.clone_at_commit(@git_repo.commits.last, rails_path)  | 
 | 90 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
90 | 91 | 
 
  | 
91 |  | -      repo.checkout(git_repo.commits[1])  | 
 | 92 | +      repo.checkout(@git_repo.commits[1])  | 
92 | 93 | 
 
  | 
93 | 94 |       expect(logger).to have_received(:info)  | 
94 |  | -        .with(/Checking out Rails \(at commit #{git_repo.commits[1][0..6]}\)/)  | 
 | 95 | +        .with(/Checking out Rails \(at commit #{@git_repo.commits[1][0..6]}\)/)  | 
95 | 96 |     end  | 
96 | 97 |   end  | 
97 | 98 | 
 
  | 
98 | 99 |   describe "#install_dependencies" do  | 
99 | 100 |     it "runs bundle check and bundle install if needed, and logs appropriately" do  | 
100 |  | -      git_repo.clone_at_commit(git_repo.commits[0], rails_path)  | 
101 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 101 | +      @git_repo.clone_at_commit(@git_repo.commits[0], rails_path)  | 
 | 102 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
102 | 103 | 
 
  | 
103 | 104 |       # Simulate bundle check failing, so bundle install is needed  | 
104 | 105 |       allow(Rails::Diff).to receive(:system!).with("bundle check", abort: false, logger: logger).and_return(false)  | 
 | 
111 | 112 |     end  | 
112 | 113 | 
 
  | 
113 | 114 |     it "does not run bundle install if bundle check passes" do  | 
114 |  | -      git_repo.clone_at_commit(git_repo.commits[0], rails_path)  | 
115 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 115 | +      @git_repo.clone_at_commit(@git_repo.commits[0], rails_path)  | 
 | 116 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
116 | 117 | 
 
  | 
117 | 118 |       # Simulate bundle check passing  | 
118 | 119 |       allow(Rails::Diff).to receive(:system!).with("bundle check", abort: false, logger: logger).and_return(true)  | 
 | 
125 | 126 | 
 
  | 
126 | 127 |   describe "#new_app" do  | 
127 | 128 |     it "runs the rails new command with the correct arguments and logs the command" do  | 
128 |  | -      git_repo.clone_at_commit(git_repo.commits.last, rails_path)  | 
129 |  | -      repo = described_class.new(logger:, cache_dir:, rails_repo: git_repo.remote_repo)  | 
 | 129 | +      @git_repo.clone_at_commit(@git_repo.commits.last, rails_path)  | 
 | 130 | +      repo = described_class.new(logger:, cache_dir:, rails_repo: @git_repo.remote_repo)  | 
130 | 131 | 
 
  | 
131 | 132 |       allow(Rails::Diff).to receive(:system!).and_return(true)  | 
132 | 133 |       app_name = "myapp"  | 
 | 
0 commit comments