// Path: src/main/java/me/itzg/mccy/model/Asset.java
// @Document(indexName = DocumentCommon.INDEX, type = Asset.TYPE)
// @JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "type")
// public abstract class Asset<DT> {
//     public static final String TYPE = "asset";
// 
//     @Id
//     @NotNull
//     private String id;
// 
//     @NotNull
//     private AssetCategory category;
// 
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private String nativeId;
//     @NotNull
//     private String name;
//     private String description;
//     private URL homepage;
//     private boolean visibleToAll;
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private String owner;
//     private ComparableVersion version;
//     private ComparableVersion compatibleMcVersion;
//     private List<ServerType> compatibleMcTypes;
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private List<String> authors;
// 
//     @JsonIgnore // so that mapping of 'details' doesn't collide
//     public abstract DT getDetails();
// 
//     public String getNativeId() {
//         return nativeId;
//     }
// 
//     public void setNativeId(String nativeId) {
//         this.nativeId = nativeId;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     public URL getHomepage() {
//         return homepage;
//     }
// 
//     public void setHomepage(URL homepage) {
//         this.homepage = homepage;
//     }
// 
//     public boolean isVisibleToAll() {
//         return visibleToAll;
//     }
// 
//     public void setVisibleToAll(boolean visibleToAll) {
//         this.visibleToAll = visibleToAll;
//     }
// 
//     public String getOwner() {
//         return owner;
//     }
// 
//     public void setOwner(String owner) {
//         this.owner = owner;
//     }
// 
//     public ComparableVersion getVersion() {
//         return version;
//     }
// 
//     public void setVersion(ComparableVersion version) {
//         this.version = version;
//     }
// 
//     public ComparableVersion getCompatibleMcVersion() {
//         return compatibleMcVersion;
//     }
// 
//     public void setCompatibleMcVersion(ComparableVersion compatibleMcVersion) {
//         this.compatibleMcVersion = compatibleMcVersion;
//     }
// 
//     public List<ServerType> getCompatibleMcTypes() {
//         return compatibleMcTypes;
//     }
// 
//     public void setCompatibleMcTypes(List<ServerType> compatibleMcTypes) {
//         this.compatibleMcTypes = compatibleMcTypes;
//     }
// 
//     public List<String> getAuthors() {
//         return authors;
//     }
// 
//     public void setAuthors(List<String> authors) {
//         this.authors = authors;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public AssetCategory getCategory() {
//         return category;
//     }
// 
//     public void setCategory(AssetCategory category) {
//         this.category = category;
//     }
// }
// 
// Path: src/main/java/me/itzg/mccy/model/WorldAsset.java
// public class WorldAsset extends Asset<WorldDescriptor> {
// 
//     private WorldDescriptor worldDetails;
// 
//     @Override
//     public WorldDescriptor getDetails() {
//         return worldDetails;
//     }
// 
//     public WorldDescriptor getWorldDetails() {
//         return worldDetails;
//     }
// 
//     public void setWorldDetails(WorldDescriptor worldDetails) {
//         this.worldDetails = worldDetails;
//     }
// }
// 
// Path: src/main/java/me/itzg/mccy/services/assets/AssetManagementService.java
// public interface AssetManagementService {
//     void saveMetadata(AssetCategory category, String assetId, Asset asset);
// 
//     void delete(AssetCategory category, String assetId);
// 
//     List<Asset> suggest(AssetCategory category, String query);
// }
// 
// Path: src/main/java/me/itzg/mccy/services/assets/AssetObjectService.java
// public interface AssetObjectService {
//     void store(MultipartFile objectFile, String parentAssetId, AssetObjectPurpose purpose) throws IOException;
// 
//     Resource retrieve(String assetId) throws FileNotFoundException;
// 
//     void deleteObjectsOfAsset(String assetId);
// }


import me.itzg.mccy.model.Asset;
import me.itzg.mccy.model.AssetCategory;
import me.itzg.mccy.model.WorldAsset;
import me.itzg.mccy.repos.AssetRepo;
import me.itzg.mccy.services.assets.AssetManagementService;
import me.itzg.mccy.services.assets.AssetObjectService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.springframework.test.util.ReflectionTestUtils;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
package me.itzg.mccy.services.assets.impl;



/**
 * @author Geoff Bourne
 * @since 0.2
 */
public class AssetManagementServiceImplTest {
    private AssetManagementService assetManagementService;
    private AssetRepo assetRepo;
// Path: src/main/java/me/itzg/mccy/model/Asset.java
// @Document(indexName = DocumentCommon.INDEX, type = Asset.TYPE)
// @JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS, property = "type")
// public abstract class Asset<DT> {
//     public static final String TYPE = "asset";
// 
//     @Id
//     @NotNull
//     private String id;
// 
//     @NotNull
//     private AssetCategory category;
// 
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private String nativeId;
//     @NotNull
//     private String name;
//     private String description;
//     private URL homepage;
//     private boolean visibleToAll;
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private String owner;
//     private ComparableVersion version;
//     private ComparableVersion compatibleMcVersion;
//     private List<ServerType> compatibleMcTypes;
//     @Field(type = FieldType.String, index = FieldIndex.not_analyzed)
//     private List<String> authors;
// 
//     @JsonIgnore // so that mapping of 'details' doesn't collide
//     public abstract DT getDetails();
// 
//     public String getNativeId() {
//         return nativeId;
//     }
// 
//     public void setNativeId(String nativeId) {
//         this.nativeId = nativeId;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     public URL getHomepage() {
//         return homepage;
//     }
// 
//     public void setHomepage(URL homepage) {
//         this.homepage = homepage;
//     }
// 
//     public boolean isVisibleToAll() {
//         return visibleToAll;
//     }
// 
//     public void setVisibleToAll(boolean visibleToAll) {
//         this.visibleToAll = visibleToAll;
//     }
// 
//     public String getOwner() {
//         return owner;
//     }
// 
//     public void setOwner(String owner) {
//         this.owner = owner;
//     }
// 
//     public ComparableVersion getVersion() {
//         return version;
//     }
// 
//     public void setVersion(ComparableVersion version) {
//         this.version = version;
//     }
// 
//     public ComparableVersion getCompatibleMcVersion() {
//         return compatibleMcVersion;
//     }
// 
//     public void setCompatibleMcVersion(ComparableVersion compatibleMcVersion) {
//         this.compatibleMcVersion = compatibleMcVersion;
//     }
// 
//     public List<ServerType> getCompatibleMcTypes() {
//         return compatibleMcTypes;
//     }
// 
//     public void setCompatibleMcTypes(List<ServerType> compatibleMcTypes) {
//         this.compatibleMcTypes = compatibleMcTypes;
//     }
// 
//     public List<String> getAuthors() {
//         return authors;
//     }
// 
//     public void setAuthors(List<String> authors) {
//         this.authors = authors;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     public AssetCategory getCategory() {
//         return category;
//     }
// 
//     public void setCategory(AssetCategory category) {
//         this.category = category;
//     }
// }
// 
// Path: src/main/java/me/itzg/mccy/model/WorldAsset.java
// public class WorldAsset extends Asset<WorldDescriptor> {
// 
//     private WorldDescriptor worldDetails;
// 
//     @Override
//     public WorldDescriptor getDetails() {
//         return worldDetails;
//     }
// 
//     public WorldDescriptor getWorldDetails() {
//         return worldDetails;
//     }
// 
//     public void setWorldDetails(WorldDescriptor worldDetails) {
//         this.worldDetails = worldDetails;
//     }
// }
// 
// Path: src/main/java/me/itzg/mccy/services/assets/AssetManagementService.java
// public interface AssetManagementService {
//     void saveMetadata(AssetCategory category, String assetId, Asset asset);
// 
//     void delete(AssetCategory category, String assetId);
// 
//     List<Asset> suggest(AssetCategory category, String query);
// }
// 
// Path: src/main/java/me/itzg/mccy/services/assets/AssetObjectService.java
// public interface AssetObjectService {
//     void store(MultipartFile objectFile, String parentAssetId, AssetObjectPurpose purpose) throws IOException;
// 
//     Resource retrieve(String assetId) throws FileNotFoundException;
// 
//     void deleteObjectsOfAsset(String assetId);
// }


// Path: src/test/java/me/itzg/mccy/services/assets/impl/AssetManagementServiceImplTest.java
import me.itzg.mccy.model.Asset;
import me.itzg.mccy.model.AssetCategory;
import me.itzg.mccy.model.WorldAsset;
import me.itzg.mccy.repos.AssetRepo;
import me.itzg.mccy.services.assets.AssetManagementService;
import me.itzg.mccy.services.assets.AssetObjectService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.springframework.test.util.ReflectionTestUtils;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

package me.itzg.mccy.services.assets.impl;



/**
 * @author Geoff Bourne
 * @since 0.2
 */
public class AssetManagementServiceImplTest {
    private AssetManagementService assetManagementService;
    private AssetRepo assetRepo;
    private AssetObjectService assetObjectService;