diff --git a/app/components/badge-circle-ci.js b/app/components/badge-circle-ci.js new file mode 100644 index 00000000000..90d97507178 --- /dev/null +++ b/app/components/badge-circle-ci.js @@ -0,0 +1,13 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + tagName: 'span', + classNames: ['badge'], + repository: Ember.computed.alias('badge.attributes.repository'), + branch: Ember.computed('badge.attributes.branch', function() { + return encodeURIComponent(this.get('badge.attributes.branch') || 'master'); + }), + text: Ember.computed('branch', function() { + return `Circle CI build status for the ${ this.get('branch') } branch`; + }) +}); diff --git a/app/templates/components/badge-circle-ci.hbs b/app/templates/components/badge-circle-ci.hbs new file mode 100644 index 00000000000..3db4fb34a34 --- /dev/null +++ b/app/templates/components/badge-circle-ci.hbs @@ -0,0 +1,6 @@ + + {{ text }} + diff --git a/src/badge.rs b/src/badge.rs index f38d95cd0a3..3c762eccafb 100644 --- a/src/badge.rs +++ b/src/badge.rs @@ -23,6 +23,10 @@ pub enum Badge { repository: String, branch: Option, }, + CircleCi { + repository: String, + branch: Option, + }, IsItMaintainedIssueResolution { repository: String }, IsItMaintainedOpenIssues { repository: String }, Codecov { diff --git a/src/tests/badge.rs b/src/tests/badge.rs index 2ff94fd54f2..829a29f47db 100644 --- a/src/tests/badge.rs +++ b/src/tests/badge.rs @@ -20,6 +20,8 @@ struct BadgeRef { codecov_attributes: HashMap, coveralls: Badge, coveralls_attributes: HashMap, + circle_ci: Badge, + circle_ci_attributes: HashMap, } fn set_up() -> (Arc, Crate, BadgeRef) { @@ -96,6 +98,14 @@ fn set_up() -> (Arc, Crate, BadgeRef) { badge_attributes_coveralls.insert(String::from("repository"), String::from("rust-lang/rust")); badge_attributes_coveralls.insert(String::from("service"), String::from("github")); + let circle_ci = Badge::CircleCi { + repository: String::from("rust-lang/rust"), + branch: Some(String::from("beta")), + }; + let mut badge_attributes_circle_ci = HashMap::new(); + badge_attributes_circle_ci.insert(String::from("branch"), String::from("beta")); + badge_attributes_circle_ci.insert(String::from("repository"), String::from("rust-lang/rust")); + let badges = BadgeRef { appveyor: appveyor, appveyor_attributes: badge_attributes_appveyor, @@ -112,6 +122,8 @@ fn set_up() -> (Arc, Crate, BadgeRef) { codecov_attributes: badge_attributes_codecov, coveralls: coveralls, coveralls_attributes: badge_attributes_coveralls, + circle_ci: circle_ci, + circle_ci_attributes: badge_attributes_circle_ci, }; (app, krate, badges) } @@ -223,6 +235,18 @@ fn update_add_coveralls() { assert_eq!(krate.badges(&conn).unwrap(), vec![test_badges.coveralls]); } +#[test] +fn update_add_circle_ci() { + // Add a CircleCI badge + let (app, krate, test_badges) = set_up(); + let conn = app.diesel_database.get().unwrap(); + + let mut badges = HashMap::new(); + badges.insert(String::from("circle-ci"), test_badges.circle_ci_attributes); + Badge::update_crate(&conn, &krate, Some(&badges)).unwrap(); + assert_eq!(krate.badges(&conn).unwrap(), vec![test_badges.circle_ci]); +} + #[test] fn replace_badge() { // Replacing one badge with another @@ -438,6 +462,24 @@ fn coveralls_required_keys() { assert_eq!(krate.badges(&conn).unwrap(), vec![]); } +#[test] +fn circle_ci_required_keys() { + // Add a CircleCI badge missing a required field + let (app, krate, mut test_badges) = set_up(); + let conn = app.diesel_database.get().unwrap(); + + let mut badges = HashMap::new(); + + // Repository is a required key + test_badges.circle_ci_attributes.remove("repository"); + badges.insert(String::from("circle-ci"), test_badges.circle_ci_attributes); + + let invalid_badges = Badge::update_crate(&conn, &krate, Some(&badges)).unwrap(); + assert_eq!(invalid_badges.len(), 1); + assert!(invalid_badges.contains(&"circle-ci")); + assert_eq!(krate.badges(&conn).unwrap(), vec![]); +} + #[test] fn unknown_badge() { // Add an unknown badge