diff --git a/app/components/badge-azure-devops.js b/app/components/badge-azure-devops.js new file mode 100644 index 00000000000..89335afd9f1 --- /dev/null +++ b/app/components/badge-azure-devops.js @@ -0,0 +1,16 @@ +import Component from '@ember/component'; +import { computed } from '@ember/object'; +import { alias } from '@ember/object/computed'; + +export default Component.extend({ + tagName: 'span', + classNames: ['badge'], + project: alias('badge.attributes.project'), + pipeline: alias('badge.attributes.pipeline'), + build: computed('badge.attributes.build', function() { + return this.get('badge.attributes.build') || '1'; + }), + text: computed('pipeline', function() { + return `Azure Devops build status for the ${this.pipeline} pipeline`; + }), +}); diff --git a/app/templates/components/badge-azure-devops.hbs b/app/templates/components/badge-azure-devops.hbs new file mode 100644 index 00000000000..8b39bac3ccd --- /dev/null +++ b/app/templates/components/badge-azure-devops.hbs @@ -0,0 +1,3 @@ + + {{ text }} + diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 3e01974beb0..e1d009be14f 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -52,6 +52,14 @@ export default [ repository: 'https://github.com/huonw/external_mixin', updated_at: '2015-02-27T11:52:13Z', badges: [ + { + attributes: { + project: 'robertohuertasm/github-oss', + pipeline: 'microserver', + build: '2', + }, + badge_type: 'azure-devops', + }, { attributes: { repository: 'huonw/external_mixin', diff --git a/src/models/badge.rs b/src/models/badge.rs index 936466fc180..ca93ed34345 100644 --- a/src/models/badge.rs +++ b/src/models/badge.rs @@ -34,6 +34,11 @@ pub enum Badge { project_name: Option, service: Option, }, + AzureDevops { + project: String, + pipeline: String, + build: Option, + }, #[serde(rename = "gitlab")] GitLab { repository: String, diff --git a/src/tests/badge.rs b/src/tests/badge.rs index 9acdda0fb5b..c81f691ff56 100644 --- a/src/tests/badge.rs +++ b/src/tests/badge.rs @@ -9,6 +9,8 @@ struct BadgeRef { travis_ci_attributes: HashMap, gitlab: Badge, gitlab_attributes: HashMap, + azure_devops: Badge, + azure_devops_attributes: HashMap, isitmaintained_issue_resolution: Badge, isitmaintained_issue_resolution_attributes: HashMap, isitmaintained_open_issues: Badge, @@ -80,6 +82,16 @@ fn set_up() -> (BadgeTestCrate, BadgeRef) { badge_attributes_gitlab.insert(String::from("branch"), String::from("beta")); badge_attributes_gitlab.insert(String::from("repository"), String::from("rust-lang/rust")); + let azure_devops = Badge::AzureDevops { + project: String::from("rust-lang"), + pipeline: String::from("rust"), + build: Some(String::from("2")), + }; + let mut badge_attributes_azure_devops = HashMap::new(); + badge_attributes_azure_devops.insert(String::from("project"), String::from("rust-lang")); + badge_attributes_azure_devops.insert(String::from("pipeline"), String::from("rust")); + badge_attributes_azure_devops.insert(String::from("build"), String::from("2")); + let isitmaintained_issue_resolution = Badge::IsItMaintainedIssueResolution { repository: String::from("rust-lang/rust"), }; @@ -138,6 +150,8 @@ fn set_up() -> (BadgeTestCrate, BadgeRef) { travis_ci_attributes: badge_attributes_travis_ci, gitlab, gitlab_attributes: badge_attributes_gitlab, + azure_devops, + azure_devops_attributes: badge_attributes_azure_devops, isitmaintained_issue_resolution, isitmaintained_issue_resolution_attributes: badge_attributes_isitmaintained_issue_resolution, @@ -198,6 +212,20 @@ fn update_add_gitlab() { assert_eq!(krate.badges(), vec![test_badges.gitlab]); } +#[test] +fn update_add_azure_devops() { + // Add a azure devops badge + let (krate, test_badges) = set_up(); + + let mut badges = HashMap::new(); + badges.insert( + String::from("azure-devops"), + test_badges.azure_devops_attributes, + ); + krate.update(&badges); + assert_eq!(krate.badges(), vec![test_badges.azure_devops]); +} + #[test] fn update_add_isitmaintained_issue_resolution() { // Add a isitmaintained_issue_resolution badge @@ -398,6 +426,26 @@ fn gitlab_required_keys() { assert_eq!(krate.badges(), vec![]); } +#[test] +fn azure_devops_required_keys() { + // Add a azure devops badge missing a required field + let (krate, mut test_badges) = set_up(); + + let mut badges = HashMap::new(); + + // project is a required key + test_badges.azure_devops_attributes.remove("project"); + badges.insert( + String::from("azure-devops"), + test_badges.azure_devops_attributes, + ); + + let invalid_badges = krate.update(&badges); + assert_eq!(invalid_badges.len(), 1); + assert_eq!(invalid_badges.first().unwrap(), "azure-devops"); + assert_eq!(krate.badges(), vec![]); +} + #[test] fn isitmaintained_issue_resolution_required_keys() { // Add a isitmaintained_issue_resolution badge missing a required field