Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/com/dtsx/astra/cli/core/models/DbRef.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.dtsx.astra.cli.core.models;

import com.datastax.astra.internal.api.AstraApiEndpoint;
import com.dtsx.astra.cli.core.CliContext;
import com.dtsx.astra.cli.core.datatypes.Either;
import com.dtsx.astra.cli.core.output.Highlightable;
Expand All @@ -19,6 +20,13 @@ public class DbRef implements Highlightable {

public static Either<String, DbRef> parse(@NonNull String ref) {
return ModelUtils.trimAndValidateBasics("Database name/id", ref).flatMap((trimmed) -> {
try {
val endpoint = AstraApiEndpoint.parse(trimmed);
return Either.pure(new DbRef(Either.left(endpoint.getDatabaseId())));
} catch (Exception e) {
// not a valid Astra endpoint URL, fall through
}

try {
return Either.pure(new DbRef(Either.left(UUID.fromString(trimmed))));
} catch (IllegalArgumentException e) {
Expand Down
88 changes: 88 additions & 0 deletions src/test/java/com/dtsx/astra/cli/unit/core/models/DbRefTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.dtsx.astra.cli.unit.core.models;

import com.dtsx.astra.cli.core.models.DbRef;
import com.dtsx.astra.cli.unit.BaseParseableTest;
import lombok.val;
import net.jqwik.api.Example;
import net.jqwik.api.Group;

import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;

public class DbRefTest extends BaseParseableTest.WithTrimAndBasicValidation {
private static final UUID SAMPLE_ID = UUID.fromString("822b0fff-6a73-4322-a8ec-09832b075287");

public DbRefTest() {
super("Database name/id", DbRef::parse);
}

@Group
public class from_name {
@Example
public void parses_plain_name_as_name_ref() {
val result = DbRef.parse("my-database");
assertThat(result.getRight().isName()).isTrue();
assertThat(result.getRight().toString()).isEqualTo("my-database");
}
}

@Group
public class from_uuid {
@Example
public void parses_uuid_as_id_ref() {
val result = DbRef.parse(SAMPLE_ID.toString());
assertThat(result.getRight().isId()).isTrue();
assertThat(result.getRight().toString()).isEqualTo(SAMPLE_ID.toString());
}
}

@Group
public class from_endpoint_url {
@Example
public void parses_prod_api_endpoint() {
val url = "https://" + SAMPLE_ID + "-us-east1.apps.astra.datastax.com";
val result = DbRef.parse(url);
assertThat(result.getRight().isId()).isTrue();
assertThat(result.getRight().toString()).isEqualTo(SAMPLE_ID.toString());
}

@Example
public void parses_dev_api_endpoint() {
val url = "https://" + SAMPLE_ID + "-ap-south-1.apps.astra-dev.datastax.com";
val result = DbRef.parse(url);
assertThat(result.getRight().isId()).isTrue();
assertThat(result.getRight().toString()).isEqualTo(SAMPLE_ID.toString());
}

@Example
public void parses_endpoint_with_path() {
val url = "https://" + SAMPLE_ID + "-us-east1.apps.astra.datastax.com/api/json/v1";
val result = DbRef.parse(url);
assertThat(result.getRight().isId()).isTrue();
assertThat(result.getRight().toString()).isEqualTo(SAMPLE_ID.toString());
}

@Example
public void parses_swagger_endpoint() {
val url = "https://" + SAMPLE_ID + "-ap-south-1.apps.astra-dev.datastax.com/api/json/swagger-ui";
val result = DbRef.parse(url);
assertThat(result.getRight().isId()).isTrue();
assertThat(result.getRight().toString()).isEqualTo(SAMPLE_ID.toString());
}

@Example
public void falls_back_to_name_for_non_astra_url() {
val url = "https://some-other-host.example.com/path";
val result = DbRef.parse(url);
assertThat(result.getRight().isName()).isTrue();
}

@Example
public void falls_back_to_name_when_url_has_no_uuid_prefix() {
val url = "https://not-a-uuid-at-all.apps.astra.datastax.com";
val result = DbRef.parse(url);
assertThat(result.getRight().isName()).isTrue();
}
}
}