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 @@
+
+
+
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