package store import ( "reflect" "strings" "testing" ) func TestApplyChange(t *testing.T) { var config ImageConfig for _, change := range []string{ `ENTRYPOINT ["/bin/sh", "-c"]`, `CMD java -version`, `ENV JAVA_HOME=/opt/jdk`, `ENV JAVA_HOME /opt/jdk21`, `ENV CI="true"`, `WORKDIR /work`, `LABEL org.opencontainers.image.title="mini image"`, `label maintainer=me`, `USER postgres`, `VOLUME /var/lib/postgresql/data`, `VOLUME ["/var/run/postgresql", "/data"]`, } { if err := ApplyChange(&config, change); err != nil { t.Fatalf("%s: %v", change, err) } } want := ImageConfig{ Env: []string{"JAVA_HOME=/opt/jdk21", "CI=true"}, Entrypoint: []string{"/bin/sh", "-c"}, Cmd: []string{"/bin/sh", "-c", "java -version"}, WorkingDir: "/work", Labels: map[string]string{"org.opencontainers.image.title": "mini image", "maintainer": "me"}, User: "postgres", Volumes: map[string]struct{}{"/var/lib/postgresql/data": {}, "/var/run/postgresql": {}, "/data": {}}, } if !reflect.DeepEqual(config, want) { t.Errorf("got %+v\nwant %+v", config, want) } } func TestApplyChangeRefusals(t *testing.T) { tests := []struct{ change, wantErr string }{ {"USER a b", "one user"}, {"VOLUME data", "absolute"}, {"EXPOSE 8080", "unsupported instruction EXPOSE"}, {"RUN apt-get install", "unsupported instruction RUN"}, {"", "empty"}, {"ENTRYPOINT", "missing value"}, {`CMD ["unterminated`, "JSON array"}, {"ENV NOVALUE", "KEY=VALUE"}, {"WORKDIR relative", "absolute"}, } for _, tt := range tests { err := ApplyChange(&ImageConfig{}, tt.change) if err == nil || !strings.Contains(err.Error(), tt.wantErr) { t.Errorf("ApplyChange(%q) = %v, want error containing %q", tt.change, err, tt.wantErr) } } }