Skip to content

Commit

Permalink
Add docker for integration tests (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
Matan Kushner committed Apr 28, 2019
1 parent 5980a0a commit 0872d52
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 18 deletions.
1 change: 1 addition & 0 deletions .dockerignore
@@ -0,0 +1 @@
target/
15 changes: 4 additions & 11 deletions azure-pipelines.yml
Expand Up @@ -20,15 +20,6 @@ jobs:
- script: cargo fmt --all -- --check
displayName: Run Rustfmt

- job: "Bench"
pool:
vmImage: "ubuntu-16.04"
container: "rust:latest"
condition: eq(variables['Build.Reason'], 'PullRequest')
steps:
- script: cargo bench
displayName: Run benchmark

- job: "Test"
strategy:
matrix:
Expand All @@ -50,6 +41,9 @@ jobs:
pool:
vmImage: "ubuntu-16.04"
steps:
- task: NodeTool@0
inputs:
versionSpec: '12.0.0'
- script: |
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUSTUP_TOOLCHAIN
echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin"
Expand All @@ -63,6 +57,5 @@ jobs:
condition: eq( variables['Agent.OS'], 'Windows_NT' )
- script: cargo build --all
displayName: Cargo build
# Until env stubbing is solved, make tests run on a single thread
- script: cargo test --all -- --test-threads=1
- script: cargo test -- --ignored
displayName: Cargo test
13 changes: 13 additions & 0 deletions integration_test
@@ -0,0 +1,13 @@
#!/bin/bash

if ! (docker --version); then
printf 'Docker is required to run the starship integration tests.\n'
printf 'Please download and install Docker in order to run these tests locally.\n'
exit 1
fi

printf 'Building test docker image:\n'
docker build -f tests/Dockerfile --tag starship-test .

printf 'Running test suite:\n'
docker run --rm -t -v $(pwd):/starship starship-test
36 changes: 36 additions & 0 deletions tests/Dockerfile
@@ -0,0 +1,36 @@
FROM rust:latest

# Install Node.js
ENV NODE_VERSION 12.0.0
RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \
&& . $HOME/.nvm/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm alias default $NODE_VERSION \
&& nvm use default
ENV PATH /root/.nvm/versions/node/v$NODE_VERSION/bin:$PATH
# Check that Node.js was correctly installed
RUN node --version

# Create blank project
RUN USER=root cargo new --bin starship
WORKDIR /starship

# We want dependencies cached, so copy those first
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml

# Cargo.toml will fail to parse without my_benchmark
RUN mkdir benches
RUN touch benches/my_benchmark.rs

# This is a dummy build to get dependencies cached
RUN cargo build --release

# Delete the dummy build
RUN rm -rf /starship

# Create the directory for the real source files
RUN mkdir starship
WORKDIR /starship

CMD [ "cargo", "test", "--", "--ignored"]
20 changes: 13 additions & 7 deletions tests/directory.rs
@@ -1,4 +1,5 @@
use ansi_term::Color;
use dirs::home_dir;
use git2::Repository;
use starship::segment::Segment;
use std::fs;
Expand All @@ -25,7 +26,8 @@ fn home_directory() -> io::Result<()> {
#[test]
#[ignore]
fn directory_in_home() -> io::Result<()> {
let dir = Path::new("~/starship/engine");
let dir = home_dir().unwrap().join("starship/engine");
fs::create_dir_all(&dir)?;

let expected = Segment::new("dir")
.set_value("~/starship/engine")
Expand All @@ -40,7 +42,8 @@ fn directory_in_home() -> io::Result<()> {
#[test]
#[ignore]
fn truncated_directory_in_home() -> io::Result<()> {
let dir = Path::new("~/starship/engine/schematics");
let dir = home_dir().unwrap().join("starship/engine/schematics");
fs::create_dir_all(&dir)?;

let expected = Segment::new("dir")
.set_value("starship/engine/schematics")
Expand All @@ -67,12 +70,11 @@ fn root_directory() -> io::Result<()> {
}

#[test]
#[ignore]
fn directory_in_root() -> io::Result<()> {
let dir = Path::new("/private");
let dir = Path::new("/opt");

let expected = Segment::new("dir")
.set_value("/private")
.set_value("/opt")
.set_style(Color::Cyan.bold())
.output();
let actual = common::render_segment("dir", &dir);
Expand All @@ -84,10 +86,11 @@ fn directory_in_root() -> io::Result<()> {
#[test]
#[ignore]
fn truncated_directory_in_root() -> io::Result<()> {
let dir = Path::new("/private/var/folders/3s");
let dir = Path::new("/opt/starship/thrusters/rocket");
fs::create_dir_all(&dir)?;

let expected = Segment::new("dir")
.set_value("var/folders/3s")
.set_value("starship/thrusters/rocket")
.set_style(Color::Cyan.bold())
.output();
let actual = common::render_segment("dir", &dir);
Expand All @@ -97,6 +100,7 @@ fn truncated_directory_in_root() -> io::Result<()> {
}

#[test]
#[ignore]
fn git_repo_root() -> io::Result<()> {
let tmp_dir = TempDir::new()?;
let repo_dir = tmp_dir.path().join("rocket-controls");
Expand All @@ -115,6 +119,7 @@ fn git_repo_root() -> io::Result<()> {
}

#[test]
#[ignore]
fn directory_in_git_repo() -> io::Result<()> {
let tmp_dir = TempDir::new()?;
let repo_dir = tmp_dir.path().join("rocket-controls");
Expand All @@ -134,6 +139,7 @@ fn directory_in_git_repo() -> io::Result<()> {
}

#[test]
#[ignore]
fn truncated_directory_in_git_repo() -> io::Result<()> {
let tmp_dir = TempDir::new()?;
let repo_dir = tmp_dir.path().join("rocket-controls");
Expand Down
56 changes: 56 additions & 0 deletions tests/nodejs.rs
@@ -0,0 +1,56 @@
use ansi_term::Color;
use starship::segment::Segment;
use std::fs::{self, File};
use std::io;
use tempfile::TempDir;

mod common;

#[test]
#[ignore]
fn folder_with_package_json() -> io::Result<()> {
let dir = TempDir::new()?;
File::create(dir.path().join("package.json"))?;

let expected = Segment::new("node")
.set_value("⬢ v12.0.0")
.set_style(Color::Green.bold())
.output();
let actual = common::render_segment("nodejs", &dir.path());
assert_eq!(expected, actual);

Ok(())
}

#[test]
#[ignore]
fn folder_with_js_file() -> io::Result<()> {
let dir = TempDir::new()?;
File::create(dir.path().join("index.js"))?;

let expected = Segment::new("node")
.set_value("⬢ v12.0.0")
.set_style(Color::Green.bold())
.output();
let actual = common::render_segment("nodejs", &dir.path());
assert_eq!(expected, actual);

Ok(())
}

#[test]
#[ignore]
fn folder_with_node_modules() -> io::Result<()> {
let dir = TempDir::new()?;
let node_modules = dir.path().join("node_modules");
fs::create_dir_all(&node_modules)?;

let expected = Segment::new("node")
.set_value("⬢ v12.0.0")
.set_style(Color::Green.bold())
.output();
let actual = common::render_segment("nodejs", &dir.path());
assert_eq!(expected, actual);

Ok(())
}

0 comments on commit 0872d52

Please sign in to comment.